SYMBOL INDEX (6455 symbols across 351 files) FILE: api/config_analyzer.py class ConfigAnalyzer (line 13) | class ConfigAnalyzer: method __init__ (line 41) | def __init__(self, config_dir: Path, base_url: str = "https://api.skil... method analyze_all_configs (line 55) | def analyze_all_configs(self) -> list[dict[str, Any]]: method analyze_config (line 80) | def analyze_config(self, config_path: Path) -> dict[str, Any] | None: method get_config_by_name (line 146) | def get_config_by_name(self, name: str) -> dict[str, Any] | None: method _determine_type (line 162) | def _determine_type(self, config_data: dict[str, Any]) -> str: method _get_primary_source (line 182) | def _get_primary_source(self, config_data: dict[str, Any], config_type... method _categorize_config (line 216) | def _categorize_config( method _extract_tags (line 265) | def _extract_tags(self, name: str, description: str, config_data: dict... method _get_max_pages (line 316) | def _get_max_pages(self, config_data: dict[str, Any]) -> int | None: method _get_last_updated (line 338) | def _get_last_updated(self, config_path: Path) -> str: FILE: api/main.py function root (line 42) | async def root(): function list_configs (line 61) | async def list_configs( function get_config (line 110) | async def get_config(name: str) -> dict[str, Any]: function list_categories (line 135) | async def list_categories() -> dict[str, Any]: function download_config (line 159) | async def download_config(config_name: str): function health_check (line 196) | async def health_check(): FILE: examples/chroma-example/1_generate_skill.py function main (line 18) | def main(): FILE: examples/chroma-example/2_upload_to_chroma.py function create_client (line 34) | def create_client(persist_directory: str = None): function load_skill_data (line 54) | def load_skill_data(filepath: str = "output/vue-chroma.json"): function create_collection (line 66) | def create_collection(client, collection_name: str, reset: bool = False): function upload_documents (line 99) | def upload_documents(collection, data: dict): function verify_upload (line 119) | def verify_upload(collection): function main (line 124) | def main(): FILE: examples/chroma-example/3_query_example.py function create_client (line 34) | def create_client(persist_directory: str = None): function get_collection (line 45) | def get_collection(client, collection_name: str = "vue"): function semantic_search_example (line 54) | def semantic_search_example(collection): function filtered_search_example (line 104) | def filtered_search_example(collection): function top_k_results_example (line 146) | def top_k_results_example(collection): function complex_filter_example (line 177) | def complex_filter_example(collection): function get_statistics (line 217) | def get_statistics(collection): function main (line 245) | def main(): FILE: examples/cline-django-assistant/generate_clinerules.py function run_command (line 18) | def run_command(cmd: list[str], description: str) -> bool: function setup_mcp_server (line 40) | def setup_mcp_server(project_path: Path) -> bool: function main (line 80) | def main(): FILE: examples/continue-dev-universal/context_server.py function load_framework_docs (line 41) | def load_framework_docs(framework: str) -> str: function root (line 74) | async def root(): function health (line 89) | async def health(): function list_frameworks (line 95) | async def list_frameworks() -> Dict[str, List[str]]: function get_framework_docs (line 131) | async def get_framework_docs(framework: str, query: str = None) -> JSONR... function get_project_conventions (line 176) | async def get_project_conventions() -> JSONResponse: function main (line 221) | def main(): FILE: examples/continue-dev-universal/quickstart.py function run_command (line 17) | def run_command(cmd: list[str], description: str) -> bool: function create_continue_config (line 39) | def create_continue_config(framework: str, port: int = 8765) -> Path: function main (line 95) | def main(): FILE: examples/cursor-react-skill/example-project/src/App.tsx function App (line 3) | function App() { FILE: examples/cursor-react-skill/generate_cursorrules.py function run_command (line 16) | def run_command(cmd: list, description: str) -> bool: function main (line 40) | def main(): FILE: examples/faiss-example/3_query_example.py function search (line 29) | def search(query_text: str, k: int = 5): FILE: examples/haystack-pipeline/quickstart.py function main (line 14) | def main(): FILE: examples/langchain-rag-pipeline/quickstart.py function load_documents (line 27) | def load_documents(json_path: str) -> list[Document]: function create_vector_store (line 54) | def create_vector_store(documents: list[Document], persist_dir: str = ".... function create_qa_chain (line 79) | def create_qa_chain(vectorstore: Chroma) -> RetrievalQA: function query_documentation (line 108) | def query_documentation(qa_chain: RetrievalQA, query: str) -> None: function main (line 132) | def main(): FILE: examples/llama-index-query-engine/quickstart.py function load_nodes (line 25) | def load_nodes(json_path: str) -> list[TextNode]: function create_index (line 60) | def create_index(nodes: list[TextNode], persist_dir: str = "./storage") ... function query_examples (line 83) | def query_examples(index: VectorStoreIndex) -> None: function interactive_chat (line 122) | def interactive_chat(index: VectorStoreIndex) -> None: function main (line 167) | def main(): FILE: examples/pinecone-upsert/quickstart.py function create_index (line 29) | def create_index(pc: Pinecone, index_name: str, dimension: int = 1536) -... function load_documents (line 59) | def load_documents(json_path: str) -> List[Dict]: function create_embeddings (line 85) | def create_embeddings(openai_client: OpenAI, texts: List[str]) -> List[L... function batch_upsert (line 103) | def batch_upsert( function semantic_search (line 160) | def semantic_search( function interactive_search (line 203) | def interactive_search(index, openai_client: OpenAI) -> None: function main (line 252) | def main(): FILE: examples/test_http_server.py function test_http_server (line 19) | async def test_http_server(): FILE: examples/weaviate-example/1_generate_skill.py function main (line 18) | def main(): FILE: examples/weaviate-example/2_upload_to_weaviate.py function connect_to_weaviate (line 35) | def connect_to_weaviate(url: str, api_key: str = None): function load_skill_data (line 66) | def load_skill_data(filepath: str = "output/react-weaviate.json"): function create_schema (line 78) | def create_schema(client, schema: dict): function upload_objects (line 102) | def upload_objects(client, class_name: str, objects: list): function verify_upload (line 133) | def verify_upload(client, class_name: str): function main (line 139) | def main(): FILE: examples/weaviate-example/3_query_example.py function connect_to_weaviate (line 34) | def connect_to_weaviate(url: str, api_key: str = None): function hybrid_search_example (line 53) | def hybrid_search_example(client, class_name: str = "React"): function keyword_only_search (line 100) | def keyword_only_search(client, class_name: str = "React"): function filtered_search (line 135) | def filtered_search(client, class_name: str = "React"): function semantic_search (line 175) | def semantic_search(client, class_name: str = "React"): function get_statistics (line 206) | def get_statistics(client, class_name: str = "React"): function main (line 238) | def main(): FILE: examples/windsurf-fastapi-context/generate_windsurfrules.py function run_command (line 17) | def run_command(cmd: list[str], description: str) -> bool: function main (line 39) | def main(): FILE: scripts/translate_doc.py function get_version (line 17) | def get_version() -> str: function translate_with_anthropic (line 26) | def translate_with_anthropic(content: str, api_key: str) -> str: function add_translation_header (line 66) | def add_translation_header(content: str, original_file: Path, target_lan... function fix_links (line 104) | def fix_links(content: str, original_file: Path) -> str: function translate_file (line 143) | def translate_file(input_path: str, target_lang: str = "zh-CN"): function main (line 199) | def main(): FILE: src/skill_seekers/_version.py function get_version (line 22) | def get_version() -> str: FILE: src/skill_seekers/benchmark/framework.py class BenchmarkResult (line 17) | class BenchmarkResult: method __init__ (line 28) | def __init__(self, name: str): method add_timing (line 45) | def add_timing(self, result: TimingResult): method add_memory (line 49) | def add_memory(self, usage: MemoryUsage): method add_metric (line 53) | def add_metric(self, metric: Metric): method add_recommendation (line 57) | def add_recommendation(self, text: str): method set_system_info (line 61) | def set_system_info(self): method to_report (line 71) | def to_report(self) -> BenchmarkReport: class Benchmark (line 99) | class Benchmark: method __init__ (line 122) | def __init__(self, name: str): method timer (line 133) | def timer(self, operation: str, iterations: int = 1): method memory (line 165) | def memory(self, operation: str): method measure (line 204) | def measure( method timed (line 242) | def timed(self, operation: str | None = None, track_memory: bool = Fal... method metric (line 270) | def metric(self, name: str, value: float, unit: str): method recommend (line 285) | def recommend(self, text: str): method report (line 298) | def report(self) -> BenchmarkReport: method save (line 307) | def save(self, path: Path): method analyze (line 324) | def analyze(self): FILE: src/skill_seekers/benchmark/models.py class Metric (line 10) | class Metric(BaseModel): class TimingResult (line 21) | class TimingResult(BaseModel): class MemoryUsage (line 32) | class MemoryUsage(BaseModel): class BenchmarkReport (line 42) | class BenchmarkReport(BaseModel): method summary (line 60) | def summary(self) -> str: class ComparisonReport (line 71) | class ComparisonReport(BaseModel): method has_regressions (line 85) | def has_regressions(self) -> bool: method overall_improvement (line 90) | def overall_improvement(self) -> str: FILE: src/skill_seekers/benchmark/runner.py class BenchmarkRunner (line 15) | class BenchmarkRunner: method __init__ (line 38) | def __init__(self, output_dir: Path | None = None): method run (line 48) | def run( method run_suite (line 90) | def run_suite( method compare (line 120) | def compare(self, baseline_path: Path, current_path: Path) -> Comparis... method list_benchmarks (line 212) | def list_benchmarks(self) -> list[dict[str, Any]]: method get_latest (line 249) | def get_latest(self, name: str) -> Path | None: method cleanup_old (line 278) | def cleanup_old(self, keep_latest: int = 5): FILE: src/skill_seekers/cli/adaptors/__init__.py function get_adaptor (line 110) | def get_adaptor(platform: str, config: dict = None) -> SkillAdaptor: function list_platforms (line 143) | def list_platforms() -> list[str]: function is_platform_available (line 157) | def is_platform_available(platform: str) -> bool: FILE: src/skill_seekers/cli/adaptors/base.py class SkillMetadata (line 18) | class SkillMetadata: class SkillAdaptor (line 29) | class SkillAdaptor(ABC): method __init__ (line 45) | def __init__(self, config: dict[str, Any] | None = None): method format_skill_md (line 55) | def format_skill_md(self, skill_dir: Path, metadata: SkillMetadata) ->... method package (line 74) | def package( method upload (line 104) | def upload(self, package_path: Path, api_key: str, **kwargs) -> dict[s... method validate_api_key (line 124) | def validate_api_key(self, api_key: str) -> bool: method get_env_var_name (line 139) | def get_env_var_name(self) -> str: method supports_enhancement (line 148) | def supports_enhancement(self) -> bool: method enhance (line 157) | def enhance(self, _skill_dir: Path, _api_key: str) -> bool: method _read_existing_content (line 172) | def _read_existing_content(self, skill_dir: Path) -> str: method _extract_quick_reference (line 196) | def _extract_quick_reference(self, skill_dir: Path) -> str: method _read_skill_md (line 214) | def _read_skill_md(self, skill_dir: Path) -> str: method _read_frontmatter (line 235) | def _read_frontmatter(self, skill_dir: Path) -> dict[str, str]: method _build_skill_metadata (line 256) | def _build_skill_metadata(self, skill_dir: Path) -> SkillMetadata: method _iterate_references (line 276) | def _iterate_references(self, skill_dir: Path): method _build_metadata_dict (line 300) | def _build_metadata_dict(self, metadata: SkillMetadata, **extra: Any) ... method _maybe_chunk_content (line 324) | def _maybe_chunk_content( method _format_output_path (line 409) | def _format_output_path(self, skill_dir: Path, output_path: Path, suff... method _generate_deterministic_id (line 454) | def _generate_deterministic_id(self, content: str, metadata: dict, for... method _generate_openai_embeddings (line 492) | def _generate_openai_embeddings( method _generate_st_embeddings (line 532) | def _generate_st_embeddings(self, documents: list[str]) -> list[list[f... method _generate_toc (line 553) | def _generate_toc(self, skill_dir: Path) -> str: FILE: src/skill_seekers/cli/adaptors/chroma.py class ChromaAdaptor (line 17) | class ChromaAdaptor(SkillAdaptor): method _generate_id (line 33) | def _generate_id(self, content: str, metadata: dict) -> str: method format_skill_md (line 46) | def format_skill_md( method package (line 151) | def package( method upload (line 216) | def upload(self, package_path: Path, api_key: str | None = None, **kwa... method validate_api_key (line 360) | def validate_api_key(self, _api_key: str) -> bool: method get_env_var_name (line 372) | def get_env_var_name(self) -> str: method supports_enhancement (line 381) | def supports_enhancement(self) -> bool: method enhance (line 393) | def enhance(self, _skill_dir: Path, _api_key: str) -> bool: FILE: src/skill_seekers/cli/adaptors/claude.py class ClaudeAdaptor (line 18) | class ClaudeAdaptor(SkillAdaptor): method format_skill_md (line 33) | def format_skill_md(self, skill_dir: Path, metadata: SkillMetadata) ->... method package (line 85) | def package( method upload (line 154) | def upload(self, package_path: Path, api_key: str, **kwargs) -> dict[s... method validate_api_key (line 289) | def validate_api_key(self, api_key: str) -> bool: method get_env_var_name (line 301) | def get_env_var_name(self) -> str: method supports_enhancement (line 310) | def supports_enhancement(self) -> bool: method enhance (line 319) | def enhance(self, skill_dir: Path, api_key: str) -> bool: method _read_reference_files (line 406) | def _read_reference_files( method _build_enhancement_prompt (line 444) | def _build_enhancement_prompt( FILE: src/skill_seekers/cli/adaptors/faiss_helpers.py class FAISSHelpers (line 17) | class FAISSHelpers(SkillAdaptor): method _generate_id (line 36) | def _generate_id(self, content: str, metadata: dict) -> str: method format_skill_md (line 49) | def format_skill_md( method package (line 162) | def package( method upload (line 227) | def upload(self, package_path: Path, _api_key: str, **_kwargs) -> dict... method validate_api_key (line 406) | def validate_api_key(self, _api_key: str) -> bool: method get_env_var_name (line 410) | def get_env_var_name(self) -> str: method supports_enhancement (line 414) | def supports_enhancement(self) -> bool: method enhance (line 418) | def enhance(self, _skill_dir: Path, _api_key: str) -> bool: FILE: src/skill_seekers/cli/adaptors/gemini.py class GeminiAdaptor (line 19) | class GeminiAdaptor(SkillAdaptor): method format_skill_md (line 34) | def format_skill_md(self, skill_dir: Path, metadata: SkillMetadata) ->... method package (line 90) | def package( method upload (line 166) | def upload(self, package_path: Path, api_key: str, **_kwargs) -> dict[... method validate_api_key (line 261) | def validate_api_key(self, api_key: str) -> bool: method get_env_var_name (line 273) | def get_env_var_name(self) -> str: method supports_enhancement (line 282) | def supports_enhancement(self) -> bool: method enhance (line 291) | def enhance(self, skill_dir: Path, api_key: str) -> bool: method _read_reference_files (line 366) | def _read_reference_files( method _build_enhancement_prompt (line 404) | def _build_enhancement_prompt( FILE: src/skill_seekers/cli/adaptors/haystack.py class HaystackAdaptor (line 17) | class HaystackAdaptor(SkillAdaptor): method format_skill_md (line 32) | def format_skill_md( method package (line 131) | def package( method upload (line 195) | def upload(self, package_path: Path, _api_key: str, **_kwargs) -> dict... method validate_api_key (line 278) | def validate_api_key(self, _api_key: str) -> bool: method get_env_var_name (line 290) | def get_env_var_name(self) -> str: method supports_enhancement (line 299) | def supports_enhancement(self) -> bool: method enhance (line 311) | def enhance(self, _skill_dir: Path, _api_key: str) -> bool: FILE: src/skill_seekers/cli/adaptors/langchain.py class LangChainAdaptor (line 17) | class LangChainAdaptor(SkillAdaptor): method format_skill_md (line 32) | def format_skill_md( method package (line 121) | def package( method upload (line 187) | def upload(self, package_path: Path, _api_key: str, **_kwargs) -> dict... method validate_api_key (line 260) | def validate_api_key(self, _api_key: str) -> bool: method get_env_var_name (line 272) | def get_env_var_name(self) -> str: method supports_enhancement (line 281) | def supports_enhancement(self) -> bool: method enhance (line 293) | def enhance(self, _skill_dir: Path, _api_key: str) -> bool: FILE: src/skill_seekers/cli/adaptors/llama_index.py class LlamaIndexAdaptor (line 17) | class LlamaIndexAdaptor(SkillAdaptor): method _generate_node_id (line 32) | def _generate_node_id(self, content: str, metadata: dict) -> str: method format_skill_md (line 45) | def format_skill_md( method package (line 150) | def package( method upload (line 214) | def upload(self, package_path: Path, _api_key: str, **_kwargs) -> dict... method validate_api_key (line 299) | def validate_api_key(self, _api_key: str) -> bool: method get_env_var_name (line 311) | def get_env_var_name(self) -> str: method supports_enhancement (line 320) | def supports_enhancement(self) -> bool: method enhance (line 332) | def enhance(self, _skill_dir: Path, _api_key: str) -> bool: FILE: src/skill_seekers/cli/adaptors/markdown.py class MarkdownAdaptor (line 17) | class MarkdownAdaptor(SkillAdaptor): method format_skill_md (line 32) | def format_skill_md(self, skill_dir: Path, metadata: SkillMetadata) ->... method package (line 85) | def package( method upload (line 164) | def upload(self, package_path: Path, _api_key: str, **_kwargs) -> dict... method validate_api_key (line 188) | def validate_api_key(self, _api_key: str) -> bool: method get_env_var_name (line 200) | def get_env_var_name(self) -> str: method supports_enhancement (line 209) | def supports_enhancement(self) -> bool: method enhance (line 218) | def enhance(self, _skill_dir: Path, _api_key: str) -> bool: method _create_combined_doc (line 233) | def _create_combined_doc(self, skill_dir: Path) -> str: FILE: src/skill_seekers/cli/adaptors/minimax.py class MiniMaxAdaptor (line 18) | class MiniMaxAdaptor(SkillAdaptor): method format_skill_md (line 32) | def format_skill_md(self, skill_dir: Path, metadata: SkillMetadata) ->... method package (line 103) | def package( method upload (line 168) | def upload(self, package_path: Path, api_key: str, **kwargs) -> dict[s... method validate_api_key (line 293) | def validate_api_key(self, api_key: str) -> bool: method get_env_var_name (line 309) | def get_env_var_name(self) -> str: method supports_enhancement (line 318) | def supports_enhancement(self) -> bool: method enhance (line 327) | def enhance(self, skill_dir: Path, api_key: str) -> bool: method _read_reference_files (line 410) | def _read_reference_files( method _build_enhancement_prompt (line 446) | def _build_enhancement_prompt( FILE: src/skill_seekers/cli/adaptors/openai.py class OpenAIAdaptor (line 18) | class OpenAIAdaptor(SkillAdaptor): method format_skill_md (line 33) | def format_skill_md(self, skill_dir: Path, metadata: SkillMetadata) ->... method package (line 107) | def package( method upload (line 177) | def upload(self, package_path: Path, api_key: str, **kwargs) -> dict[s... method validate_api_key (line 303) | def validate_api_key(self, api_key: str) -> bool: method get_env_var_name (line 315) | def get_env_var_name(self) -> str: method supports_enhancement (line 324) | def supports_enhancement(self) -> bool: method enhance (line 333) | def enhance(self, skill_dir: Path, api_key: str) -> bool: method _read_reference_files (line 417) | def _read_reference_files( method _build_enhancement_prompt (line 455) | def _build_enhancement_prompt( FILE: src/skill_seekers/cli/adaptors/pinecone_adaptor.py class PineconeAdaptor (line 21) | class PineconeAdaptor(SkillAdaptor): method _generate_id (line 37) | def _generate_id(self, content: str, metadata: dict) -> str: method _truncate_text_for_metadata (line 41) | def _truncate_text_for_metadata( method format_skill_md (line 66) | def format_skill_md( method package (line 192) | def package( method upload (line 257) | def upload(self, package_path: Path, api_key: str | None = None, **kwa... method validate_api_key (line 387) | def validate_api_key(self, _api_key: str) -> bool: method get_env_var_name (line 391) | def get_env_var_name(self) -> str: method supports_enhancement (line 395) | def supports_enhancement(self) -> bool: method enhance (line 399) | def enhance(self, _skill_dir: Path, _api_key: str) -> bool: FILE: src/skill_seekers/cli/adaptors/qdrant.py class QdrantAdaptor (line 17) | class QdrantAdaptor(SkillAdaptor): method _generate_point_id (line 34) | def _generate_point_id(self, content: str, metadata: dict) -> str: method format_skill_md (line 47) | def format_skill_md( method package (line 198) | def package( method upload (line 265) | def upload(self, package_path: Path, _api_key: str, **_kwargs) -> dict... method validate_api_key (line 470) | def validate_api_key(self, _api_key: str) -> bool: method get_env_var_name (line 474) | def get_env_var_name(self) -> str: method supports_enhancement (line 478) | def supports_enhancement(self) -> bool: method enhance (line 482) | def enhance(self, _skill_dir: Path, _api_key: str) -> bool: FILE: src/skill_seekers/cli/adaptors/streaming_adaptor.py class StreamingAdaptorMixin (line 21) | class StreamingAdaptorMixin: method package_streaming (line 33) | def package_streaming( method _convert_chunks_to_platform_format (line 123) | def _convert_chunks_to_platform_format( method estimate_chunks (line 157) | def estimate_chunks( class StreamingLangChainAdaptor (line 234) | class StreamingLangChainAdaptor(StreamingAdaptorMixin): method _convert_chunks_to_platform_format (line 240) | def _convert_chunks_to_platform_format(self, chunks, skill_name): class StreamingChromaAdaptor (line 269) | class StreamingChromaAdaptor(StreamingAdaptorMixin): method _convert_chunks_to_platform_format (line 275) | def _convert_chunks_to_platform_format(self, chunks, skill_name): function demo_streaming (line 305) | def demo_streaming(): FILE: src/skill_seekers/cli/adaptors/weaviate.py class WeaviateAdaptor (line 17) | class WeaviateAdaptor(SkillAdaptor): method _generate_uuid (line 34) | def _generate_uuid(self, content: str, metadata: dict) -> str: method _generate_schema (line 47) | def _generate_schema(self, class_name: str) -> dict: method format_skill_md (line 114) | def format_skill_md( method package (line 237) | def package( method upload (line 307) | def upload(self, package_path: Path, api_key: str | None = None, **kwa... method validate_api_key (line 445) | def validate_api_key(self, _api_key: str) -> bool: method get_env_var_name (line 457) | def get_env_var_name(self) -> str: method supports_enhancement (line 466) | def supports_enhancement(self) -> bool: method enhance (line 478) | def enhance(self, _skill_dir: Path, _api_key: str) -> bool: FILE: src/skill_seekers/cli/ai_enhancer.py class AIAnalysis (line 46) | class AIAnalysis: class AIEnhancer (line 57) | class AIEnhancer: method __init__ (line 60) | def __init__(self, api_key: str | None = None, enabled: bool = True, m... method _check_claude_cli (line 125) | def _check_claude_cli(self) -> bool: method _call_claude (line 138) | def _call_claude(self, prompt: str, max_tokens: int = 1000) -> str | N... method _call_claude_api (line 146) | def _call_claude_api(self, prompt: str, max_tokens: int = 1000) -> str... method _call_claude_local (line 162) | def _call_claude_local(self, prompt: str) -> str | None: class PatternEnhancer (line 240) | class PatternEnhancer(AIEnhancer): method enhance_patterns (line 243) | def enhance_patterns(self, patterns: list[dict]) -> list[dict]: method _enhance_patterns_parallel (line 286) | def _enhance_patterns_parallel(self, batches: list[list[dict]], worker... method _enhance_pattern_batch (line 319) | def _enhance_pattern_batch(self, patterns: list[dict]) -> list[dict]: class TestExampleEnhancer (line 378) | class TestExampleEnhancer(AIEnhancer): method enhance_examples (line 381) | def enhance_examples(self, examples: list[dict]) -> list[dict]: method _enhance_examples_parallel (line 424) | def _enhance_examples_parallel(self, batches: list[list[dict]], worker... method _enhance_example_batch (line 457) | def _enhance_example_batch(self, examples: list[dict]) -> list[dict]: method generate_tutorials (line 511) | def generate_tutorials(self, examples: list[dict]) -> dict[str, list[d... FILE: src/skill_seekers/cli/api_reference_builder.py class APIReferenceBuilder (line 25) | class APIReferenceBuilder: method __init__ (line 33) | def __init__(self, code_analysis: dict[str, Any]): method build_reference (line 44) | def build_reference(self, output_dir: Path) -> dict[str, Path]: method _get_output_filename (line 80) | def _get_output_filename(self, source_file: str) -> str: method _generate_file_reference (line 97) | def _generate_file_reference( method _format_class (line 138) | def _format_class(self, class_sig: dict[str, Any]) -> str: method _format_method (line 177) | def _format_method(self, method_sig: dict[str, Any]) -> str: method _format_function (line 217) | def _format_function(self, func_sig: dict[str, Any]) -> str: method _build_signature (line 257) | def _build_signature(self, sig: dict[str, Any]) -> str: method _format_parameters (line 296) | def _format_parameters(self, params: list[dict]) -> str: function main (line 331) | def main(): FILE: src/skill_seekers/cli/architectural_pattern_detector.py class ArchitecturalPattern (line 32) | class ArchitecturalPattern: class ArchitecturalReport (line 44) | class ArchitecturalReport: method to_dict (line 53) | def to_dict(self) -> dict: class ArchitecturalPatternDetector (line 74) | class ArchitecturalPatternDetector: method __init__ (line 142) | def __init__(self, enhance_with_ai: bool = True): method analyze (line 161) | def analyze(self, directory: Path, files_analysis: list[dict]) -> Arch... method _analyze_directory_structure (line 204) | def _analyze_directory_structure(self, directory: Path) -> dict[str, i... method _detect_frameworks (line 223) | def _detect_frameworks(self, directory: Path, files: list[dict]) -> li... method _detect_mvc (line 298) | def _detect_mvc( method _detect_mvvm (line 366) | def _detect_mvvm( method _detect_repository (line 438) | def _detect_repository( method _detect_service_layer (line 480) | def _detect_service_layer( method _detect_layered_architecture (line 519) | def _detect_layered_architecture( method _detect_clean_architecture (line 561) | def _detect_clean_architecture( method _enhance_with_ai (line 604) | def _enhance_with_ai(self, report: ArchitecturalReport) -> dict: FILE: src/skill_seekers/cli/arguments/analyze.py function add_analyze_arguments (line 153) | def add_analyze_arguments(parser: argparse.ArgumentParser) -> None: function get_analyze_argument_names (line 182) | def get_analyze_argument_names() -> set: FILE: src/skill_seekers/cli/arguments/asciidoc.py function add_asciidoc_arguments (line 40) | def add_asciidoc_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/chat.py function add_chat_arguments (line 74) | def add_chat_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/common.py function add_common_arguments (line 138) | def add_common_arguments(parser: argparse.ArgumentParser) -> None: function add_behavior_arguments (line 157) | def add_behavior_arguments(parser: argparse.ArgumentParser) -> None: function add_all_standard_arguments (line 165) | def add_all_standard_arguments(parser: argparse.ArgumentParser) -> None: function get_common_argument_names (line 179) | def get_common_argument_names() -> set: function add_rag_arguments (line 188) | def add_rag_arguments(parser: argparse.ArgumentParser) -> None: function get_rag_argument_names (line 207) | def get_rag_argument_names() -> set: function get_behavior_argument_names (line 216) | def get_behavior_argument_names() -> set: function get_all_standard_argument_names (line 221) | def get_all_standard_argument_names() -> set: function get_argument_help (line 232) | def get_argument_help(arg_name: str) -> str: FILE: src/skill_seekers/cli/arguments/confluence.py function add_confluence_arguments (line 81) | def add_confluence_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/create.py function get_universal_argument_names (line 708) | def get_universal_argument_names() -> set[str]: function get_source_specific_arguments (line 713) | def get_source_specific_arguments(source_type: str) -> dict[str, dict[st... function get_compatible_arguments (line 746) | def get_compatible_arguments(source_type: str) -> list[str]: function add_create_arguments (line 768) | def add_create_arguments(parser: argparse.ArgumentParser, mode: str = "d... FILE: src/skill_seekers/cli/arguments/enhance.py function add_enhance_arguments (line 112) | def add_enhance_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/epub.py function add_epub_arguments (line 40) | def add_epub_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/github.py function add_github_arguments (line 114) | def add_github_arguments(parser: argparse.ArgumentParser) -> None: function get_github_argument_names (line 143) | def get_github_argument_names() -> set: function get_github_argument_count (line 154) | def get_github_argument_count() -> int: FILE: src/skill_seekers/cli/arguments/html.py function add_html_arguments (line 40) | def add_html_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/jupyter.py function add_jupyter_arguments (line 40) | def add_jupyter_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/manpage.py function add_manpage_arguments (line 56) | def add_manpage_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/notion.py function add_notion_arguments (line 73) | def add_notion_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/openapi.py function add_openapi_arguments (line 48) | def add_openapi_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/package.py function add_package_arguments (line 139) | def add_package_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/pdf.py function add_pdf_arguments (line 48) | def add_pdf_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/pptx.py function add_pptx_arguments (line 40) | def add_pptx_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/rss.py function add_rss_arguments (line 73) | def add_rss_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/scrape.py function add_scrape_arguments (line 147) | def add_scrape_arguments(parser: argparse.ArgumentParser) -> None: function get_scrape_argument_names (line 184) | def get_scrape_argument_names() -> set: function get_scrape_argument_count (line 195) | def get_scrape_argument_count() -> int: FILE: src/skill_seekers/cli/arguments/sync_config.py function add_sync_config_arguments (line 10) | def add_sync_config_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/unified.py function add_unified_arguments (line 100) | def add_unified_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/upload.py function add_upload_arguments (line 102) | def add_upload_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/video.py function add_video_arguments (line 140) | def add_video_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/word.py function add_word_arguments (line 40) | def add_word_arguments(parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/arguments/workflow.py function add_workflow_arguments (line 66) | def add_workflow_arguments(parser, include_all=True): FILE: src/skill_seekers/cli/asciidoc_scraper.py function _check_asciidoc_deps (line 64) | def _check_asciidoc_deps() -> None: function infer_description_from_asciidoc (line 73) | def infer_description_from_asciidoc(metadata: dict | None = None, name: ... function _score_code_quality (line 92) | def _score_code_quality(code: str) -> float: class AsciiDocToSkillConverter (line 115) | class AsciiDocToSkillConverter: method __init__ (line 123) | def __init__(self, config: dict) -> None: method extract_asciidoc (line 139) | def extract_asciidoc(self) -> bool: method _discover_files (line 237) | def _discover_files(self, path: Path) -> list[Path]: method _extract_attributes (line 251) | def _extract_attributes(text: str) -> dict[str, str]: method _resolve_attributes (line 256) | def _resolve_attributes(text: str, attributes: dict[str, str]) -> str: method _resolve_includes (line 260) | def _resolve_includes(self, text: str, base_dir: Path) -> str: method _build_metadata (line 285) | def _build_metadata(attributes: dict[str, str], file_path: Path) -> dict: method _parse_asciidoc_sections (line 302) | def _parse_asciidoc_sections(self, text: str) -> list[dict]: method _extract_code_blocks (line 342) | def _extract_code_blocks(self, text: str) -> list[dict]: method _extract_tables (line 411) | def _extract_tables(self, text: str) -> list[dict]: method _parse_table_body (line 426) | def _parse_table_body(table_body: str) -> dict | None: method _extract_admonitions (line 477) | def _extract_admonitions(self, text: str) -> list[dict]: method _extract_includes (line 494) | def _extract_includes(text: str) -> list[dict]: method _convert_to_markdown (line 505) | def _convert_to_markdown(self, text: str) -> str: method load_extracted_data (line 558) | def load_extracted_data(self, json_path: str) -> bool: method categorize_content (line 567) | def categorize_content(self) -> dict: method build_skill (line 626) | def build_skill(self) -> None: method _ref_filename (line 646) | def _ref_filename(self, cat_data: dict, section_num: int, total: int) ... method _generate_reference_file (line 662) | def _generate_reference_file( method _generate_index (line 703) | def _generate_index(self, categorized: dict) -> None: method _generate_skill_md (line 744) | def _generate_skill_md(self, categorized: dict) -> None: method _format_key_concepts (line 869) | def _format_key_concepts(self) -> str: method _format_patterns_from_content (line 891) | def _format_patterns_from_content(self) -> str: method _sanitize_filename (line 937) | def _sanitize_filename(name: str) -> str: method _in_range (line 943) | def _in_range(pos: int, ranges: list[tuple[int, int]]) -> bool: function main (line 953) | def main() -> int: FILE: src/skill_seekers/cli/benchmark_cli.py function run_command (line 16) | def run_command(args): function run_scraping_benchmark (line 37) | def run_scraping_benchmark(runner, config): function run_embedding_benchmark (line 61) | def run_embedding_benchmark(runner, config): function run_storage_benchmark (line 90) | def run_storage_benchmark(runner, config): function compare_command (line 129) | def compare_command(args): function list_command (line 153) | def list_command(args): function show_command (line 173) | def show_command(args): function cleanup_command (line 203) | def cleanup_command(args): function main (line 212) | def main(): FILE: src/skill_seekers/cli/chat_scraper.py function _check_slack_deps (line 181) | def _check_slack_deps() -> None: function _check_discord_deps (line 191) | def _check_discord_deps() -> None: function _score_code_quality (line 206) | def _score_code_quality(code: str) -> float: class ChatToSkillConverter (line 246) | class ChatToSkillConverter: method __init__ (line 264) | def __init__(self, config: dict) -> None: method extract_chat (line 301) | def extract_chat(self) -> bool: method load_extracted_data (line 400) | def load_extracted_data(self, json_path: str) -> bool: method categorize_content (line 420) | def categorize_content(self) -> dict[str, dict]: method build_skill (line 498) | def build_skill(self) -> None: method _extract_slack_export (line 531) | def _extract_slack_export(self) -> list[dict]: method _load_slack_users (line 599) | def _load_slack_users(self, export_dir: Path) -> dict[str, str]: method _unzip_export (line 633) | def _unzip_export(self, zip_path: Path) -> Path: method _extract_slack_api (line 659) | def _extract_slack_api(self) -> list[dict]: method _fetch_slack_channel_messages (line 706) | def _fetch_slack_channel_messages( method _extract_discord_export (line 755) | def _extract_discord_export(self) -> list[dict]: method _extract_discord_api (line 826) | def _extract_discord_api(self) -> list[dict]: method _parse_slack_message (line 917) | def _parse_slack_message( method _parse_discord_message (line 1029) | def _parse_discord_message(self, raw: dict, channel: str) -> dict | None: method _extract_code_snippets (line 1146) | def _extract_code_snippets(self, messages: list[dict]) -> list[dict]: method _extract_links (line 1183) | def _extract_links(self, messages: list[dict]) -> list[dict]: method _identify_threads (line 1224) | def _identify_threads(self, messages: list[dict]) -> list[dict]: method _summarize_channels (line 1275) | def _summarize_channels(self, messages: list[dict]) -> dict[str, dict]: method _build_sections (line 1321) | def _build_sections(self, messages: list[dict], threads: list[dict]) -... method _generate_reference_file (line 1409) | def _generate_reference_file( method _generate_index (line 1467) | def _generate_index(self, categorized: dict[str, dict]) -> None: method _generate_skill_md (line 1529) | def _generate_skill_md(self, categorized: dict[str, dict]) -> None: method _format_key_topics (line 1676) | def _format_key_topics(self) -> str: method _section_text (line 1708) | def _section_text(self, section: dict) -> str: method _sanitize_filename (line 1722) | def _sanitize_filename(self, name: str) -> str: function main (line 1740) | def main() -> int: FILE: src/skill_seekers/cli/cloud_storage_cli.py function upload_command (line 15) | def upload_command(args): function download_command (line 36) | def download_command(args): function list_command (line 56) | def list_command(args): function delete_command (line 85) | def delete_command(args): function url_command (line 102) | def url_command(args): function copy_command (line 114) | def copy_command(args): function format_size (line 125) | def format_size(size_bytes: int) -> str: function parse_extra_args (line 134) | def parse_extra_args(extra: list | None) -> dict: function main (line 150) | def main(): FILE: src/skill_seekers/cli/code_analyzer.py class Parameter (line 39) | class Parameter: class FunctionSignature (line 48) | class FunctionSignature: method __post_init__ (line 60) | def __post_init__(self): class ClassSignature (line 66) | class ClassSignature: class CodeAnalyzer (line 76) | class CodeAnalyzer: method __init__ (line 81) | def __init__(self, depth: str = "surface"): method _offset_to_line (line 91) | def _offset_to_line(self, offset: int) -> int: method analyze_file (line 95) | def analyze_file(self, file_path: str, content: str, language: str) ->... method _analyze_python (line 147) | def _analyze_python(self, content: str, file_path: str) -> dict[str, A... method _extract_python_class (line 192) | def _extract_python_class(self, node: ast.ClassDef) -> ClassSignature: method _extract_python_function (line 222) | def _extract_python_function(self, node, is_method: bool = False) -> F... method _analyze_javascript (line 279) | def _analyze_javascript(self, content: str, _file_path: str) -> dict[s... method _extract_js_methods (line 389) | def _extract_js_methods(self, class_body: str) -> list[dict]: method _parse_js_parameters (line 421) | def _parse_js_parameters(self, params_str: str) -> list[dict]: method _analyze_cpp (line 455) | def _analyze_cpp(self, content: str, _file_path: str) -> dict[str, Any]: method _parse_cpp_parameters (line 513) | def _parse_cpp_parameters(self, params_str: str) -> list[dict]: method _extract_python_comments (line 548) | def _extract_python_comments(self, content: str) -> list[dict]: method _extract_js_comments (line 570) | def _extract_js_comments(self, content: str) -> list[dict]: method _extract_cpp_comments (line 594) | def _extract_cpp_comments(self, content: str) -> list[dict]: method _analyze_csharp (line 603) | def _analyze_csharp(self, content: str, _file_path: str) -> dict[str, ... method _extract_csharp_methods (line 714) | def _extract_csharp_methods(self, class_body: str) -> list[dict]: method _parse_csharp_parameters (line 747) | def _parse_csharp_parameters(self, params_str: str) -> list[dict]: method _extract_csharp_comments (line 789) | def _extract_csharp_comments(self, content: str) -> list[dict]: method _analyze_go (line 814) | def _analyze_go(self, content: str, _file_path: str) -> dict[str, Any]: method _parse_go_parameters (line 884) | def _parse_go_parameters(self, params_str: str) -> list[dict]: method _extract_go_comments (line 919) | def _extract_go_comments(self, content: str) -> list[dict]: method _analyze_rust (line 924) | def _analyze_rust(self, content: str, _file_path: str) -> dict[str, Any]: method _parse_rust_parameters (line 982) | def _parse_rust_parameters(self, params_str: str) -> list[dict]: method _extract_rust_comments (line 1016) | def _extract_rust_comments(self, content: str) -> list[dict]: method _analyze_java (line 1043) | def _analyze_java(self, content: str, _file_path: str) -> dict[str, Any]: method _extract_java_methods (line 1150) | def _extract_java_methods(self, class_body: str) -> list[dict]: method _parse_java_parameters (line 1181) | def _parse_java_parameters(self, params_str: str) -> list[dict]: method _extract_java_comments (line 1222) | def _extract_java_comments(self, content: str) -> list[dict]: method _analyze_ruby (line 1245) | def _analyze_ruby(self, content: str, _file_path: str) -> dict[str, Any]: method _parse_ruby_parameters (line 1321) | def _parse_ruby_parameters(self, params_str: str) -> list[dict]: method _extract_ruby_comments (line 1349) | def _extract_ruby_comments(self, content: str) -> list[dict]: method _analyze_php (line 1363) | def _analyze_php(self, content: str, _file_path: str) -> dict[str, Any]: method _extract_php_methods (line 1464) | def _extract_php_methods(self, class_body: str) -> list[dict]: method _parse_php_parameters (line 1491) | def _parse_php_parameters(self, params_str: str) -> list[dict]: method _extract_php_comments (line 1529) | def _extract_php_comments(self, content: str) -> list[dict]: method _analyze_godot_scene (line 1552) | def _analyze_godot_scene(self, content: str, file_path: str) -> dict[s... method _analyze_godot_resource (line 1603) | def _analyze_godot_resource(self, content: str, file_path: str) -> dic... method _analyze_godot_shader (line 1660) | def _analyze_godot_shader(self, content: str, file_path: str) -> dict[... method _analyze_gdscript (line 1706) | def _analyze_gdscript(self, content: str, file_path: str) -> dict[str,... FILE: src/skill_seekers/cli/codebase_scraper.py function detect_language (line 174) | def detect_language(file_path: Path) -> str: function load_gitignore (line 188) | def load_gitignore(directory: Path) -> pathspec.PathSpec | None: function should_exclude_dir (line 218) | def should_exclude_dir(dir_name: str, excluded_dirs: set) -> bool: function walk_directory (line 232) | def walk_directory( function walk_markdown_files (line 289) | def walk_markdown_files( function categorize_markdown_file (line 339) | def categorize_markdown_file(file_path: Path, root: Path) -> str: function extract_markdown_structure (line 374) | def extract_markdown_structure(content: str) -> dict[str, Any]: function extract_rst_structure (line 439) | def extract_rst_structure(content: str) -> dict[str, Any]: function generate_markdown_summary (line 585) | def generate_markdown_summary( function process_markdown_docs (line 644) | def process_markdown_docs( function _enhance_docs_with_ai (line 899) | def _enhance_docs_with_ai(docs: list[dict], ai_mode: str) -> list[dict]: function _enhance_docs_api (line 923) | def _enhance_docs_api(docs: list[dict], api_key: str) -> list[dict]: function _enhance_docs_local (line 984) | def _enhance_docs_local(docs: list[dict]) -> list[dict]: function analyze_codebase (line 1045) | def analyze_codebase( function _generate_skill_md (line 1615) | def _generate_skill_md( function _get_language_stats (line 1820) | def _get_language_stats(files: list[dict]) -> dict[str, int]: function _format_patterns_section (line 1831) | def _format_patterns_section(output_dir: Path) -> str: function _format_examples_section (line 1883) | def _format_examples_section(output_dir: Path) -> str: function _format_api_section (line 1926) | def _format_api_section(output_dir: Path) -> str: function _format_architecture_section (line 1953) | def _format_architecture_section(output_dir: Path) -> str: function _format_config_section (line 1987) | def _format_config_section(output_dir: Path) -> str: function _format_signal_flow_section (line 2028) | def _format_signal_flow_section(output_dir: Path, results: dict[str, Any... function _format_documentation_section (line 2097) | def _format_documentation_section(_output_dir: Path, docs_data: dict[str... function _generate_references (line 2179) | def _generate_references(output_dir: Path): function _check_deprecated_flags (line 2222) | def _check_deprecated_flags(args): function main (line 2273) | def main(): FILE: src/skill_seekers/cli/config_command.py function show_welcome_message (line 12) | def show_welcome_message(): function main_menu (line 57) | def main_menu(): function github_token_menu (line 100) | def github_token_menu(): function add_github_profile (line 145) | def add_github_profile(): function remove_github_profile (line 231) | def remove_github_profile(): function set_default_profile (line 263) | def set_default_profile(): function open_github_token_page (line 295) | def open_github_token_page(): function api_keys_menu (line 307) | def api_keys_menu(): function set_api_key (line 352) | def set_api_key(provider: str, url: str): function rate_limit_settings (line 375) | def rate_limit_settings(): function resume_settings (line 420) | def resume_settings(): function test_connections (line 458) | def test_connections(): function main (line 522) | def main(): FILE: src/skill_seekers/cli/config_enhancer.py class ConfigEnhancement (line 39) | class ConfigEnhancement: class EnhancedConfigFile (line 50) | class EnhancedConfigFile: class ConfigEnhancer (line 60) | class ConfigEnhancer: method __init__ (line 70) | def __init__(self, mode: str = "auto"): method _detect_mode (line 90) | def _detect_mode(self, requested_mode: str) -> str: method enhance_config_result (line 111) | def enhance_config_result(self, result: dict) -> dict: method _enhance_via_api (line 132) | def _enhance_via_api(self, result: dict) -> dict: method _create_enhancement_prompt (line 159) | def _create_enhancement_prompt(self, result: dict) -> str: method _parse_api_response (line 219) | def _parse_api_response(self, response_text: str, original_result: dic... method _enhance_via_local (line 254) | def _enhance_via_local(self, result: dict) -> dict: method _create_local_prompt (line 288) | def _create_local_prompt(self, result: dict, output_file: Path) -> str: method _run_claude_cli (line 369) | def _run_claude_cli( function main (line 461) | def main(): FILE: src/skill_seekers/cli/config_extractor.py class ConfigSetting (line 52) | class ConfigSetting: class ConfigFile (line 67) | class ConfigFile: class ConfigExtractionResult (line 91) | class ConfigExtractionResult: method to_dict (line 100) | def to_dict(self) -> dict: method to_markdown (line 131) | def to_markdown(self) -> str: class ConfigFileDetector (line 168) | class ConfigFileDetector: method find_config_files (line 265) | def find_config_files(self, directory: Path, max_files: int = 100) -> ... method _walk_directory (line 300) | def _walk_directory(self, directory: Path): method _detect_config_type (line 318) | def _detect_config_type(self, file_path: Path) -> str | None: method _infer_purpose (line 335) | def _infer_purpose(self, file_path: Path, _config_type: str) -> str: class ConfigParser (line 380) | class ConfigParser: method parse_config_file (line 383) | def parse_config_file(self, config_file: ConfigFile) -> ConfigFile: method _parse_json (line 425) | def _parse_json(self, config_file: ConfigFile): method _parse_yaml (line 446) | def _parse_yaml(self, config_file: ConfigFile): method _parse_toml (line 468) | def _parse_toml(self, config_file: ConfigFile): method _parse_env (line 480) | def _parse_env(self, config_file: ConfigFile): method _parse_ini (line 506) | def _parse_ini(self, config_file: ConfigFile): method _parse_python_config (line 526) | def _parse_python_config(self, config_file: ConfigFile): method _parse_javascript_config (line 558) | def _parse_javascript_config(self, config_file: ConfigFile): method _parse_dockerfile (line 578) | def _parse_dockerfile(self, config_file: ConfigFile): method _extract_settings_from_dict (line 607) | def _extract_settings_from_dict( method _infer_type (line 627) | def _infer_type(self, value: Any) -> str: method _extract_env_description (line 644) | def _extract_env_description(self, lines: list[str], line_index: int) ... method _extract_python_docstring (line 652) | def _extract_python_docstring(self, _node: ast.AST) -> str: class ConfigPatternDetector (line 658) | class ConfigPatternDetector: method detect_patterns (line 708) | def detect_patterns(self, config_file: ConfigFile) -> list[str]: class ConfigExtractor (line 740) | class ConfigExtractor: method __init__ (line 743) | def __init__(self): method extract_from_directory (line 748) | def extract_from_directory( method to_dict (line 803) | def to_dict(self, result: ConfigExtractionResult) -> dict: function main (line 835) | def main(): FILE: src/skill_seekers/cli/config_fetcher.py function fetch_config_from_api (line 22) | def fetch_config_from_api( function list_available_configs (line 100) | def list_available_configs(category: str | None = None, timeout: float =... function resolve_config_path (line 133) | def resolve_config_path(config_path: str, auto_fetch: bool = True) -> Pa... function get_last_searched_paths (line 203) | def get_last_searched_paths() -> list[Path]: FILE: src/skill_seekers/cli/config_manager.py function _get_config_dir (line 17) | def _get_config_dir() -> Path: function _get_progress_dir (line 24) | def _get_progress_dir() -> Path: class ConfigManager (line 31) | class ConfigManager: method __init__ (line 60) | def __init__(self): method _ensure_directories (line 75) | def _ensure_directories(self): method _load_config (line 90) | def _load_config(self) -> dict[str, Any]: method _merge_with_defaults (line 107) | def _merge_with_defaults(self, config: dict[str, Any]) -> dict[str, Any]: method save_config (line 121) | def save_config(self): method add_github_profile (line 137) | def add_github_profile( method remove_github_profile (line 171) | def remove_github_profile(self, name: str): method list_github_profiles (line 186) | def list_github_profiles(self) -> list[dict[str, Any]]: method get_github_token (line 204) | def get_github_token( method get_profile_for_token (line 239) | def get_profile_for_token(self, token: str) -> str | None: method get_next_profile (line 246) | def get_next_profile(self, current_token: str) -> tuple | None: method get_rate_limit_strategy (line 273) | def get_rate_limit_strategy(self, token: str | None = None) -> str: method get_timeout_minutes (line 284) | def get_timeout_minutes(self, token: str | None = None) -> int: method set_api_key (line 296) | def set_api_key(self, provider: str, key: str): method get_api_key (line 305) | def get_api_key(self, provider: str) -> str | None: method save_progress (line 331) | def save_progress(self, job_id: str, progress_data: dict[str, Any]): method load_progress (line 344) | def load_progress(self, job_id: str) -> dict[str, Any] | None: method list_resumable_jobs (line 357) | def list_resumable_jobs(self) -> list[dict[str, Any]]: method delete_progress (line 383) | def delete_progress(self, job_id: str): method cleanup_old_progress (line 389) | def cleanup_old_progress(self): method get_default_enhance_level (line 407) | def get_default_enhance_level(self) -> int: method set_default_enhance_level (line 411) | def set_default_enhance_level(self, level: int): method get_local_batch_size (line 420) | def get_local_batch_size(self) -> int: method set_local_batch_size (line 424) | def set_local_batch_size(self, size: int): method get_local_parallel_workers (line 431) | def get_local_parallel_workers(self) -> int: method set_local_parallel_workers (line 435) | def set_local_parallel_workers(self, workers: int): method get_default_agent (line 442) | def get_default_agent(self) -> str | None: method set_default_agent (line 450) | def set_default_agent(self, agent: str | None): method is_first_run (line 463) | def is_first_run(self) -> bool: method mark_first_run_complete (line 467) | def mark_first_run_complete(self): method should_show_welcome (line 472) | def should_show_welcome(self) -> bool: method mark_welcome_shown (line 476) | def mark_welcome_shown(self): method display_config_summary (line 485) | def display_config_summary(self): function get_config_manager (line 551) | def get_config_manager() -> ConfigManager: FILE: src/skill_seekers/cli/config_validator.py class ConfigValidator (line 37) | class ConfigValidator: method __init__ (line 72) | def __init__(self, config_or_path: dict[str, Any] | str): method _load_config (line 87) | def _load_config(self) -> dict[str, Any]: method validate (line 97) | def validate(self) -> bool: method _validate_unified (line 134) | def _validate_unified(self) -> bool: method _validate_source (line 171) | def _validate_source(self, source: dict[str, Any], index: int): method _validate_documentation_source (line 220) | def _validate_documentation_source(self, source: dict[str, Any], index... method _validate_github_source (line 234) | def _validate_github_source(self, source: dict[str, Any], index: int): method _validate_pdf_source (line 275) | def _validate_pdf_source(self, source: dict[str, Any], index: int): method _validate_local_source (line 285) | def _validate_local_source(self, source: dict[str, Any], index: int): method _validate_word_source (line 313) | def _validate_word_source(self, source: dict[str, Any], index: int): method _validate_video_source (line 321) | def _validate_video_source(self, source: dict[str, Any], index: int): method _validate_epub_source (line 331) | def _validate_epub_source(self, source: dict[str, Any], index: int): method _validate_jupyter_source (line 339) | def _validate_jupyter_source(self, source: dict[str, Any], index: int): method _validate_html_source (line 347) | def _validate_html_source(self, source: dict[str, Any], index: int): method _validate_openapi_source (line 355) | def _validate_openapi_source(self, source: dict[str, Any], index: int): method _validate_asciidoc_source (line 362) | def _validate_asciidoc_source(self, source: dict[str, Any], index: int): method _validate_pptx_source (line 370) | def _validate_pptx_source(self, source: dict[str, Any], index: int): method _validate_confluence_source (line 378) | def _validate_confluence_source(self, source: dict[str, Any], index: i... method _validate_notion_source (line 390) | def _validate_notion_source(self, source: dict[str, Any], index: int): method _validate_rss_source (line 400) | def _validate_rss_source(self, source: dict[str, Any], index: int): method _validate_manpage_source (line 405) | def _validate_manpage_source(self, source: dict[str, Any], index: int): method _validate_chat_source (line 412) | def _validate_chat_source(self, source: dict[str, Any], index: int): method get_sources_by_type (line 427) | def get_sources_by_type(self, source_type: str) -> list[dict[str, Any]]: method has_multiple_sources (line 440) | def has_multiple_sources(self) -> bool: method needs_api_merge (line 444) | def needs_api_merge(self) -> bool: function validate_config (line 467) | def validate_config(config_path: str) -> ConfigValidator: FILE: src/skill_seekers/cli/conflict_detector.py class Conflict (line 25) | class Conflict: class ConflictDetector (line 37) | class ConflictDetector: method __init__ (line 42) | def __init__(self, docs_data: dict[str, Any], github_data: dict[str, A... method _extract_docs_apis (line 60) | def _extract_docs_apis(self) -> dict[str, dict[str, Any]]: method _parse_doc_content_for_apis (line 106) | def _parse_doc_content_for_apis(self, content: str, source_url: str) -... method _parse_param_string (line 176) | def _parse_param_string(self, params_str: str) -> list[dict]: method _extract_code_apis (line 214) | def _extract_code_apis(self) -> dict[str, dict[str, Any]]: method detect_all_conflicts (line 277) | def detect_all_conflicts(self) -> list[Conflict]: method _find_missing_in_docs (line 301) | def _find_missing_in_docs(self) -> list[Conflict]: method _find_missing_in_code (line 328) | def _find_missing_in_code(self) -> list[Conflict]: method _find_signature_mismatches (line 348) | def _find_signature_mismatches(self) -> list[Conflict]: method _compare_signatures (line 378) | def _compare_signatures(self, docs_info: dict, code_info: dict) -> dic... method generate_summary (line 436) | def generate_summary(self, conflicts: list[Conflict]) -> dict[str, Any]: method save_conflicts (line 470) | def save_conflicts(self, conflicts: list[Conflict], output_path: str): FILE: src/skill_seekers/cli/confluence_scraper.py function _check_atlassian_deps (line 135) | def _check_atlassian_deps() -> None: function infer_description_from_confluence (line 145) | def infer_description_from_confluence( class ConfluenceToSkillConverter (line 180) | class ConfluenceToSkillConverter: method __init__ (line 212) | def __init__(self, config: dict) -> None: method extract_confluence (line 249) | def extract_confluence(self) -> bool: method _extract_via_api (line 373) | def _extract_via_api(self) -> list[dict[str, Any]]: method _is_cloud_instance (line 519) | def _is_cloud_instance(self) -> bool: method _extract_from_export (line 533) | def _extract_from_export(self) -> list[dict[str, Any]]: method _parse_entities_xml (line 638) | def _parse_entities_xml( method _parse_export_index (line 710) | def _parse_export_index(self, index_path: Path) -> dict[str, str]: method _parse_confluence_html (line 758) | def _parse_confluence_html( method _extract_macros (line 882) | def _extract_macros(self, soup: BeautifulSoup) -> list[dict[str, Any]]: method _clean_confluence_html (line 970) | def _clean_confluence_html(self, soup: BeautifulSoup) -> BeautifulSoup: method _extract_page_tree (line 1025) | def _extract_page_tree( method _extract_table (line 1083) | def _extract_table(self, table_elem: Tag) -> dict[str, Any] | None: method _detect_language_from_classes (line 1130) | def _detect_language_from_classes(self, elem: Tag) -> str: method _html_to_text (line 1162) | def _html_to_text(self, elem: Tag | BeautifulSoup) -> str: method load_extracted_data (line 1258) | def load_extracted_data(self, json_path: str) -> bool: method categorize_content (line 1285) | def categorize_content(self) -> dict[str, dict[str, Any]]: method _collect_descendant_ids (line 1376) | def _collect_descendant_ids(self, node: dict[str, Any]) -> list[str]: method build_skill (line 1397) | def build_skill(self) -> None: method _generate_reference_file (line 1446) | def _generate_reference_file( method _generate_index (line 1581) | def _generate_index(self, categorised: dict[str, dict[str, Any]]) -> N... method _write_tree_structure (line 1631) | def _write_tree_structure( method _generate_skill_md (line 1652) | def _generate_skill_md(self, categorised: dict[str, dict[str, Any]]) -... method _format_key_topics (line 1798) | def _format_key_topics(self) -> str: method _sanitize_filename (line 1851) | def _sanitize_filename(self, name: str) -> str: function _score_code_quality (line 1873) | def _score_code_quality(code: str) -> float: function main (line 1926) | def main() -> int: FILE: src/skill_seekers/cli/create_command.py class CreateCommand (line 21) | class CreateCommand: method __init__ (line 24) | def __init__(self, args: argparse.Namespace): method execute (line 33) | def execute(self) -> int: method _validate_arguments (line 62) | def _validate_arguments(self) -> None: method _is_explicitly_set (line 89) | def _is_explicitly_set(self, arg_name: str, arg_value: any) -> bool: method _route_to_scraper (line 121) | def _route_to_scraper(self) -> int: method _route_web (line 167) | def _route_web(self) -> int: method _route_github (line 234) | def _route_github(self) -> int: method _route_local (line 281) | def _route_local(self) -> int: method _route_pdf (line 324) | def _route_pdf(self) -> int: method _route_word (line 353) | def _route_word(self) -> int: method _route_epub (line 376) | def _route_epub(self) -> int: method _route_video (line 399) | def _route_video(self) -> int: method _route_config (line 462) | def _route_config(self) -> int: method _route_generic (line 508) | def _route_generic(self, module_name: str, file_flag: str) -> int: method _add_common_args (line 542) | def _add_common_args(self, argv: list[str]) -> None: function main (line 597) | def main() -> int: FILE: src/skill_seekers/cli/dependency_analyzer.py class DependencyInfo (line 62) | class DependencyInfo: class FileNode (line 73) | class FileNode: class DependencyAnalyzer (line 82) | class DependencyAnalyzer: method __init__ (line 90) | def __init__(self): method _offset_to_line (line 102) | def _offset_to_line(self, offset: int) -> int: method analyze_file (line 106) | def analyze_file(self, file_path: str, content: str, language: str) ->... method _extract_python_imports (line 160) | def _extract_python_imports(self, content: str, file_path: str) -> lis... method _extract_gdscript_imports (line 211) | def _extract_gdscript_imports(self, content: str, file_path: str) -> l... method _extract_js_imports (line 330) | def _extract_js_imports(self, content: str, file_path: str) -> list[De... method _extract_cpp_includes (line 379) | def _extract_cpp_includes(self, content: str, file_path: str) -> list[... method _extract_csharp_imports (line 410) | def _extract_csharp_imports(self, content: str, file_path: str) -> lis... method _extract_go_imports (line 448) | def _extract_go_imports(self, content: str, file_path: str) -> list[De... method _extract_rust_imports (line 509) | def _extract_rust_imports(self, content: str, file_path: str) -> list[... method _extract_java_imports (line 566) | def _extract_java_imports(self, content: str, file_path: str) -> list[... method _extract_ruby_imports (line 598) | def _extract_ruby_imports(self, content: str, file_path: str) -> list[... method _extract_php_imports (line 662) | def _extract_php_imports(self, content: str, file_path: str) -> list[D... method build_graph (line 718) | def build_graph(self) -> nx.DiGraph: method _resolve_import (line 750) | def _resolve_import( method detect_cycles (line 782) | def detect_cycles(self) -> list[list[str]]: method get_strongly_connected_components (line 800) | def get_strongly_connected_components(self) -> list[set[str]]: method export_dot (line 809) | def export_dot(self, output_path: str): method export_json (line 825) | def export_json(self) -> dict[str, Any]: method export_mermaid (line 848) | def export_mermaid(self) -> str: method get_statistics (line 873) | def get_statistics(self) -> dict[str, Any]: method _extract_godot_resources (line 898) | def _extract_godot_resources(self, content: str, file_path: str) -> li... FILE: src/skill_seekers/cli/doc_scraper.py function infer_description_from_docs (line 73) | def infer_description_from_docs( class DocToSkillConverter (line 155) | class DocToSkillConverter: method __init__ (line 156) | def __init__(self, config: dict[str, Any], dry_run: bool = False, resu... method _enqueue_url (line 227) | def _enqueue_url(self, url: str) -> None: method is_valid_url (line 238) | def is_valid_url(self, url: str) -> bool: method save_checkpoint (line 255) | def save_checkpoint(self) -> None: method load_checkpoint (line 276) | def load_checkpoint(self) -> None: method clear_checkpoint (line 303) | def clear_checkpoint(self) -> None: method _find_main_content (line 312) | def _find_main_content(self, soup: Any) -> tuple[Any, str | None]: method extract_content (line 341) | def extract_content(self, soup: Any, url: str) -> dict[str, Any]: method _extract_markdown_content (line 407) | def _extract_markdown_content(self, content: str, url: str) -> dict[st... method _extract_html_as_markdown (line 559) | def _extract_html_as_markdown(self, html_content: str, url: str) -> di... method detect_language (line 637) | def detect_language(self, elem, code): method extract_patterns (line 650) | def extract_patterns( method clean_text (line 672) | def clean_text(self, text: str) -> str: method save_page (line 676) | def save_page(self, page: dict[str, Any]) -> None: method scrape_page (line 693) | def scrape_page(self, url: str) -> None: method scrape_page_async (line 750) | async def scrape_page_async( method _convert_to_md_urls (line 799) | def _convert_to_md_urls(self, urls: list[str]) -> list[str]: method _try_llms_txt (line 867) | def _try_llms_txt(self) -> bool: method scrape_all (line 1064) | def scrape_all(self) -> None: method scrape_all_async (line 1234) | async def scrape_all_async(self) -> None: method save_summary (line 1377) | def save_summary(self) -> None: method load_scraped_data (line 1394) | def load_scraped_data(self) -> list[dict[str, Any]]: method smart_categorize (line 1419) | def smart_categorize(self, pages: list[dict[str, Any]]) -> dict[str, l... method infer_categories (line 1468) | def infer_categories(self, pages: list[dict[str, Any]]) -> dict[str, l... method generate_quick_reference (line 1499) | def generate_quick_reference(self, pages: list[dict[str, Any]]) -> lis... method create_reference_file (line 1520) | def create_reference_file(self, category: str, pages: list[dict[str, A... method create_enhanced_skill_md (line 1567) | def create_enhanced_skill_md( method create_index (line 1707) | def create_index(self, categories: dict[str, list[dict[str, Any]]]) ->... method build_skill (line 1724) | def build_skill(self) -> bool: function validate_config (line 1774) | def validate_config(config: dict[str, Any]) -> tuple[list[str], list[str]]: function load_config (line 1898) | def load_config(config_path: str) -> dict[str, Any]: function interactive_config (line 1986) | def interactive_config() -> dict[str, Any]: function check_existing_data (line 2044) | def check_existing_data(name: str) -> tuple[bool, int]: function setup_argument_parser (line 2066) | def setup_argument_parser() -> argparse.ArgumentParser: function get_configuration (line 2096) | def get_configuration(args: argparse.Namespace) -> dict[str, Any]: function execute_scraping_and_building (line 2207) | def execute_scraping_and_building( function execute_enhancement (line 2365) | def execute_enhancement(config: dict[str, Any], args: argparse.Namespace... function main (line 2451) | def main() -> None: FILE: src/skill_seekers/cli/embedding_pipeline.py class EmbeddingConfig (line 20) | class EmbeddingConfig: class EmbeddingResult (line 33) | class EmbeddingResult: class CostTracker (line 45) | class CostTracker: method add_request (line 54) | def add_request(self, token_count: int, cost: float, from_cache: bool ... method get_stats (line 65) | def get_stats(self) -> dict[str, Any]: class EmbeddingProvider (line 79) | class EmbeddingProvider(ABC): method generate_embeddings (line 83) | def generate_embeddings(self, texts: list[str]) -> list[list[float]]: method get_dimension (line 88) | def get_dimension(self) -> int: method estimate_cost (line 93) | def estimate_cost(self, token_count: int) -> float: class OpenAIEmbeddingProvider (line 98) | class OpenAIEmbeddingProvider(EmbeddingProvider): method __init__ (line 114) | def __init__(self, model: str = "text-embedding-ada-002", api_key: str... method _get_client (line 120) | def _get_client(self): method generate_embeddings (line 133) | def generate_embeddings(self, texts: list[str]) -> list[list[float]]: method get_dimension (line 144) | def get_dimension(self) -> int: method estimate_cost (line 148) | def estimate_cost(self, token_count: int) -> float: class LocalEmbeddingProvider (line 154) | class LocalEmbeddingProvider(EmbeddingProvider): method __init__ (line 157) | def __init__(self, dimension: int = 384): method generate_embeddings (line 161) | def generate_embeddings(self, texts: list[str]) -> list[list[float]]: method get_dimension (line 174) | def get_dimension(self) -> int: method estimate_cost (line 178) | def estimate_cost(self, token_count: int) -> float: class EmbeddingCache (line 183) | class EmbeddingCache: method __init__ (line 186) | def __init__(self, cache_dir: Path | None = None): method _compute_hash (line 194) | def _compute_hash(self, text: str, model: str) -> str: method get (line 199) | def get(self, text: str, model: str) -> list[float] | None: method set (line 221) | def set(self, text: str, model: str, embedding: list[float]) -> None: class EmbeddingPipeline (line 246) | class EmbeddingPipeline: method __init__ (line 253) | def __init__(self, config: EmbeddingConfig): method _create_provider (line 260) | def _create_provider(self) -> EmbeddingProvider: method _estimate_tokens (line 269) | def _estimate_tokens(self, text: str) -> int: method generate_batch (line 274) | def generate_batch(self, texts: list[str], show_progress: bool = True)... method validate_dimensions (line 365) | def validate_dimensions(self, embeddings: list[list[float]]) -> bool: method get_cost_stats (line 387) | def get_cost_stats(self) -> dict[str, Any]: function example_usage (line 392) | def example_usage(): FILE: src/skill_seekers/cli/enhance_command.py function _is_root (line 32) | def _is_root() -> bool: function _get_api_keys (line 40) | def _get_api_keys() -> dict[str, str | None]: function _get_config_default_agent (line 49) | def _get_config_default_agent() -> str | None: function _pick_mode (line 59) | def _pick_mode(args) -> tuple[str, str | None]: function _run_api_mode (line 97) | def _run_api_mode(args, target: str) -> int: function _run_local_mode (line 140) | def _run_local_mode(args) -> int: function main (line 171) | def main() -> int: FILE: src/skill_seekers/cli/enhance_skill.py class SkillEnhancer (line 34) | class SkillEnhancer: method __init__ (line 35) | def __init__(self, skill_dir, api_key=None): method read_current_skill_md (line 59) | def read_current_skill_md(self): method enhance_skill_md (line 65) | def enhance_skill_md(self, references, current_skill_md): method _is_video_source (line 100) | def _is_video_source(self, references): method _build_enhancement_prompt (line 104) | def _build_enhancement_prompt(self, references, current_skill_md): method _build_video_enhancement_prompt (line 287) | def _build_video_enhancement_prompt(self, references, current_skill_md): method save_enhanced_skill_md (line 429) | def save_enhanced_skill_md(self, content): method run (line 441) | def run(self): function main (line 499) | def main(): FILE: src/skill_seekers/cli/enhance_skill_local.py function detect_terminal_app (line 65) | def detect_terminal_app(): function _normalize_agent_name (line 138) | def _normalize_agent_name(agent_name: str) -> str: class LocalSkillEnhancer (line 153) | class LocalSkillEnhancer: method __init__ (line 154) | def __init__(self, skill_dir, force=True, agent=None, agent_cmd=None): method _validate_custom_command (line 170) | def _validate_custom_command(self, cmd_template: str) -> None: method _resolve_agent (line 195) | def _resolve_agent(self, agent, agent_cmd): method _build_agent_command (line 220) | def _build_agent_command(self, prompt_file, include_permissions_flag): method _format_agent_command (line 244) | def _format_agent_command(self, prompt_file, include_permissions_flag): method _run_agent_command (line 253) | def _run_agent_command(self, prompt_file, timeout, include_permissions... method summarize_reference (line 292) | def summarize_reference(self, content: str, target_ratio: float = 0.3)... method create_enhancement_prompt (line 384) | def create_enhancement_prompt(self, use_summarization=False, summariza... method write_status (line 621) | def write_status(self, status, message="", progress=0.0, error=None): method read_status (line 641) | def read_status(self): method run (line 655) | def run(self, headless=True, timeout=600, background=False, daemon=Fal... method _run_headless (line 832) | def _run_headless(self, prompt_file, timeout): method _run_background (line 962) | def _run_background(self, headless, timeout): method _run_daemon (line 1062) | def _run_daemon(self, timeout): function _detect_api_target (line 1229) | def _detect_api_target() -> tuple[str, str] | None: function _run_api_enhance (line 1253) | def _run_api_enhance(target: str, api_key: str) -> None: function main (line 1284) | def main(): FILE: src/skill_seekers/cli/enhance_status.py function read_status (line 19) | def read_status(skill_dir): function format_status (line 39) | def format_status(status): function watch_status (line 94) | def watch_status(skill_dir, interval=2): function main (line 130) | def main(): FILE: src/skill_seekers/cli/enhancement_workflow.py class WorkflowStage (line 39) | class WorkflowStage: class PostProcessConfig (line 52) | class PostProcessConfig: class EnhancementWorkflow (line 62) | class EnhancementWorkflow: class WorkflowEngine (line 75) | class WorkflowEngine: method __init__ (line 87) | def __init__(self, workflow: EnhancementWorkflow | str | Path): method _load_workflow (line 102) | def _load_workflow(self, workflow_ref: str | Path) -> EnhancementWorkf... method _merge_workflows (line 200) | def _merge_workflows(self, parent: EnhancementWorkflow, child_data: di... method run (line 252) | def run(self, analysis_results: dict, context: dict | None = None) -> ... method _build_stage_context (line 317) | def _build_stage_context( method _run_stage (line 338) | def _run_stage(self, stage: WorkflowStage, context: dict) -> dict: method _run_builtin_stage (line 345) | def _run_builtin_stage(self, stage: WorkflowStage, context: dict) -> d... method _run_custom_stage (line 367) | def _run_custom_stage(self, stage: WorkflowStage, context: dict) -> dict: method _merge_stage_results (line 403) | def _merge_stage_results(self, current: dict, stage_results: dict, tar... method _post_process (line 413) | def _post_process(self, results: dict) -> dict: method save_history (line 443) | def save_history(self, output_path: Path): function list_bundled_workflows (line 461) | def list_bundled_workflows() -> list[str]: function list_user_workflows (line 475) | def list_user_workflows() -> list[str]: FILE: src/skill_seekers/cli/epub_scraper.py function _check_epub_deps (line 36) | def _check_epub_deps(): function infer_description_from_epub (line 46) | def infer_description_from_epub(metadata: dict | None = None, name: str ... class EpubToSkillConverter (line 71) | class EpubToSkillConverter: method __init__ (line 74) | def __init__(self, config): method extract_epub (line 92) | def extract_epub(self): method _detect_drm (line 213) | def _detect_drm(self, book) -> bool: method _extract_metadata (line 266) | def _extract_metadata(self, book) -> dict: method _extract_spine_content (line 296) | def _extract_spine_content(self, book) -> list[dict]: method _extract_images (line 373) | def _extract_images(self, book) -> int: method load_extracted_data (line 404) | def load_extracted_data(self, json_path): method categorize_content (line 413) | def categorize_content(self): method build_skill (line 485) | def build_skill(self): method _generate_reference_file (line 514) | def _generate_reference_file(self, _cat_key, cat_data, section_num, to... method _generate_index (line 610) | def _generate_index(self, categorized): method _generate_skill_md (line 663) | def _generate_skill_md(self, categorized): method _format_key_concepts (line 805) | def _format_key_concepts(self) -> str: method _format_patterns_from_content (line 844) | def _format_patterns_from_content(self) -> str: method _sanitize_filename (line 894) | def _sanitize_filename(self, name): function _build_section (line 906) | def _build_section( function _extract_table_from_html (line 1005) | def _extract_table_from_html(table_elem) -> dict | None: function _score_code_quality (line 1035) | def _score_code_quality(code: str) -> float: function main (line 1073) | def main(): FILE: src/skill_seekers/cli/estimate_pages.py function estimate_pages (line 23) | def estimate_pages(config, max_discovery=DEFAULT_MAX_DISCOVERY, timeout=... function is_valid_url (line 140) | def is_valid_url(url, base_url, include_patterns, exclude_patterns): function print_results (line 160) | def print_results(results, config): function load_config (line 214) | def load_config(config_path): function find_configs_directory (line 228) | def find_configs_directory(): function list_all_configs (line 251) | def list_all_configs(): function main (line 344) | def main(): FILE: src/skill_seekers/cli/generate_router.py class RouterGenerator (line 34) | class RouterGenerator: method __init__ (line 37) | def __init__( method load_config (line 76) | def load_config(self, path: Path) -> dict[str, Any]: method infer_router_name (line 85) | def infer_router_name(self) -> str: method extract_routing_keywords (line 98) | def extract_routing_keywords(self) -> dict[str, list[str]]: method _extract_skill_specific_labels (line 149) | def _extract_skill_specific_labels(self, _skill_name: str, skill_keywo... method _generate_frontmatter (line 201) | def _generate_frontmatter(self, _routing_keywords: dict[str, list[str]... method _extract_clean_readme_section (line 269) | def _extract_clean_readme_section(self, readme: str) -> str: method _extract_topic_from_skill (line 291) | def _extract_topic_from_skill(self, skill_name: str) -> str: method _generate_dynamic_examples (line 338) | def _generate_dynamic_examples(self, routing_keywords: dict[str, list[... method _generate_examples_from_github (line 400) | def _generate_examples_from_github(self, routing_keywords: dict[str, l... method _convert_issue_to_question (line 453) | def _convert_issue_to_question(self, issue_title: str) -> str: method _extract_common_patterns (line 488) | def _extract_common_patterns(self) -> list[dict[str, str]]: method _parse_issue_pattern (line 522) | def _parse_issue_pattern(self, issue_title: str) -> tuple: method _detect_framework (line 560) | def _detect_framework(self) -> str | None: method _get_framework_hello_world (line 598) | def _get_framework_hello_world(self, framework: str) -> str: method _generate_comprehensive_description (line 677) | def _generate_comprehensive_description(self) -> str: method generate_skill_md (line 719) | def generate_skill_md(self) -> str: method generate_subskill_issues_section (line 927) | def generate_subskill_issues_section(self, _skill_name: str, topics: l... method create_router_config (line 987) | def create_router_config(self) -> dict[str, Any]: method _generate_github_issues_reference (line 1009) | def _generate_github_issues_reference(self) -> str: method _generate_getting_started_reference (line 1066) | def _generate_getting_started_reference(self) -> str: method _generate_reference_files (line 1089) | def _generate_reference_files(self, references_dir: Path): method generate (line 1112) | def generate(self, output_dir: Path = None) -> tuple[Path, Path]: function main (line 1142) | def main(): FILE: src/skill_seekers/cli/github_fetcher.py class CodeStream (line 26) | class CodeStream: class DocsStream (line 34) | class DocsStream: class InsightsStream (line 43) | class InsightsStream: class ThreeStreamData (line 53) | class ThreeStreamData: class GitHubThreeStreamFetcher (line 61) | class GitHubThreeStreamFetcher: method __init__ (line 79) | def __init__( method parse_repo_url (line 109) | def parse_repo_url(self, url: str) -> tuple[str, str]: method fetch (line 137) | def fetch(self, output_dir: Path = None) -> ThreeStreamData: method clone_repo (line 194) | def clone_repo(self, output_dir: Path) -> Path: method fetch_github_metadata (line 216) | def fetch_github_metadata(self) -> dict: method fetch_issues (line 268) | def fetch_issues(self, max_issues: int = 100) -> list[dict]: method _fetch_issues_page (line 288) | def _fetch_issues_page(self, state: str, max_count: int) -> list[dict]: method classify_files (line 332) | def classify_files(self, repo_path: Path) -> tuple[list[Path], list[Pa... method analyze_issues (line 435) | def analyze_issues(self, issues: list[dict]) -> dict: method read_file (line 514) | def read_file(self, file_path: Path) -> str | None: FILE: src/skill_seekers/cli/github_scraper.py function extract_description_from_readme (line 105) | def extract_description_from_readme(readme_content: str, repo_name: str)... class GitHubScraper (line 186) | class GitHubScraper: method __init__ (line 202) | def __init__(self, config: dict[str, Any], local_repo_path: str | None... method _get_token (line 289) | def _get_token(self) -> str | None: method scrape (line 311) | def scrape(self) -> dict[str, Any]: method _fetch_repository (line 356) | def _fetch_repository(self): method _get_file_content (line 390) | def _get_file_content(self, file_path: str) -> str | None: method _extract_readme (line 467) | def _extract_readme(self): method _extract_code_structure (line 499) | def _extract_code_structure(self): method _extract_languages (line 516) | def _extract_languages(self): method should_exclude_dir (line 539) | def should_exclude_dir(self, dir_name: str, dir_path: str = None) -> b... method _load_gitignore (line 574) | def _load_gitignore(self) -> Optional["pathspec.PathSpec"]: method _extract_file_tree (line 603) | def _extract_file_tree(self): method _extract_file_tree_local (line 614) | def _extract_file_tree_local(self): method _extract_file_tree_github (line 666) | def _extract_file_tree_github(self): method _extract_signatures_and_tests (line 693) | def _extract_signatures_and_tests(self): method _extract_issues (line 807) | def _extract_issues(self): method _extract_changelog (line 841) | def _extract_changelog(self): method _extract_releases (line 866) | def _extract_releases(self): method _save_data (line 897) | def _save_data(self): class GitHubToSkillConverter (line 907) | class GitHubToSkillConverter: method __init__ (line 912) | def __init__(self, config: dict[str, Any]): method _load_data (line 936) | def _load_data(self) -> dict[str, Any]: method build_skill (line 944) | def build_skill(self): method _generate_skill_md (line 962) | def _generate_skill_md(self): method _format_languages (line 1091) | def _format_languages(self) -> str: method _format_recent_releases (line 1103) | def _format_recent_releases(self) -> str: method _format_pattern_summary (line 1117) | def _format_pattern_summary(self, c3_data: dict[str, Any]) -> str: method _format_code_examples (line 1158) | def _format_code_examples(self, c3_data: dict[str, Any]) -> str: method _format_api_reference (line 1187) | def _format_api_reference(self, c3_data: dict[str, Any]) -> str: method _format_architecture (line 1210) | def _format_architecture(self, c3_data: dict[str, Any]) -> str: method _format_known_issues (line 1244) | def _format_known_issues(self) -> str: method _generate_references (line 1267) | def _generate_references(self): method _generate_issues_reference (line 1295) | def _generate_issues_reference(self): method _generate_releases_reference (line 1326) | def _generate_releases_reference(self): method _generate_file_structure_reference (line 1350) | def _generate_file_structure_reference(self): function setup_argument_parser (line 1372) | def setup_argument_parser() -> argparse.ArgumentParser: function main (line 1400) | def main(): FILE: src/skill_seekers/cli/guide_enhancer.py class PrerequisiteItem (line 35) | class PrerequisiteItem: class TroubleshootingItem (line 41) | class TroubleshootingItem: class StepEnhancement (line 61) | class StepEnhancement: class GuideEnhancer (line 69) | class GuideEnhancer: method __init__ (line 79) | def __init__(self, mode: str = "auto"): method _detect_mode (line 127) | def _detect_mode(self, requested_mode: str) -> str: method _check_claude_cli (line 147) | def _check_claude_cli(self) -> bool: method enhance_guide (line 157) | def enhance_guide(self, guide_data: dict) -> dict: method enhance_step_descriptions (line 181) | def enhance_step_descriptions(self, steps: list[dict]) -> list[StepEnh... method enhance_troubleshooting (line 214) | def enhance_troubleshooting(self, guide_data: dict) -> list[Troublesho... method enhance_prerequisites (line 248) | def enhance_prerequisites(self, prereqs: list[str]) -> list[Prerequisi... method enhance_next_steps (line 279) | def enhance_next_steps(self, guide_data: dict) -> list[str]: method enhance_use_cases (line 305) | def enhance_use_cases(self, guide_data: dict) -> list[str]: method _call_ai (line 333) | def _call_ai(self, prompt: str, max_tokens: int = 4000) -> str | None: method _call_claude_api (line 350) | def _call_claude_api(self, prompt: str, max_tokens: int = 4000) -> str... method _call_claude_local (line 375) | def _call_claude_local(self, prompt: str) -> str | None: method _enhance_via_api (line 414) | def _enhance_via_api(self, guide_data: dict) -> dict: method _enhance_via_local (line 432) | def _enhance_via_local(self, guide_data: dict) -> dict: method _create_enhancement_prompt (line 450) | def _create_enhancement_prompt(self, guide_data: dict) -> str: method _create_step_description_prompt (line 543) | def _create_step_description_prompt(self, steps: list[dict]) -> str: method _create_troubleshooting_prompt (line 561) | def _create_troubleshooting_prompt(self, guide_data: dict) -> str: method _create_prerequisites_prompt (line 590) | def _create_prerequisites_prompt(self, prereqs: list[str]) -> str: method _create_next_steps_prompt (line 608) | def _create_next_steps_prompt(self, guide_data: dict) -> str: method _create_use_cases_prompt (line 625) | def _create_use_cases_prompt(self, guide_data: dict) -> str: method _format_steps_for_prompt (line 647) | def _format_steps_for_prompt(self, steps: list[dict]) -> str: method _parse_enhancement_response (line 663) | def _parse_enhancement_response(self, response: str, guide_data: dict)... FILE: src/skill_seekers/cli/how_to_guide_builder.py class PrerequisiteItem (line 52) | class PrerequisiteItem: class TroubleshootingItem (line 61) | class TroubleshootingItem: class WorkflowStep (line 71) | class WorkflowStep: class HowToGuide (line 86) | class HowToGuide: method to_dict (line 122) | def to_dict(self) -> dict: class GuideCollection (line 131) | class GuideCollection: method to_dict (line 139) | def to_dict(self) -> dict: class WorkflowAnalyzer (line 156) | class WorkflowAnalyzer: method analyze_workflow (line 159) | def analyze_workflow(self, workflow: dict) -> tuple[list[WorkflowStep]... method _extract_steps_python (line 195) | def _extract_steps_python(self, code: str, workflow: dict) -> list[Wor... method _extract_steps_heuristic (line 244) | def _extract_steps_heuristic(self, code: str, _workflow: dict) -> list... method _generate_step_description (line 285) | def _generate_step_description(self, node: ast.AST, code: str) -> str: method _describe_value (line 299) | def _describe_value(self, node: ast.AST) -> str: method _get_name (line 310) | def _get_name(self, node: ast.AST) -> str: method _infer_description_from_code (line 320) | def _infer_description_from_code(self, code: str) -> str: method _detect_prerequisites (line 342) | def _detect_prerequisites(self, workflow: dict) -> dict: method _find_verification_points (line 368) | def _find_verification_points(self, code: str) -> list[str]: method _calculate_complexity (line 379) | def _calculate_complexity(self, steps: list[WorkflowStep], workflow: d... method _estimate_time (line 399) | def _estimate_time(self, steps: list[WorkflowStep]) -> str: class WorkflowGrouper (line 418) | class WorkflowGrouper: method group_workflows (line 421) | def group_workflows( method _group_by_ai_tutorial_group (line 450) | def _group_by_ai_tutorial_group(self, workflows: list[dict]) -> dict[s... method _group_by_file_path (line 473) | def _group_by_file_path(self, workflows: list[dict]) -> dict[str, list... method _group_by_test_name (line 487) | def _group_by_test_name(self, workflows: list[dict]) -> dict[str, list... method _group_by_complexity (line 499) | def _group_by_complexity(self, workflows: list[dict]) -> dict[str, lis... method _clean_test_name (line 516) | def _clean_test_name(self, test_name: str) -> str: method _extract_prefix (line 525) | def _extract_prefix(self, test_name: str) -> str: class GuideGenerator (line 541) | class GuideGenerator: method generate_guide_markdown (line 544) | def generate_guide_markdown(self, guide: HowToGuide) -> str: method _create_header (line 584) | def _create_header(self, guide: HowToGuide) -> str: method _create_overview (line 596) | def _create_overview(self, guide: HowToGuide) -> str: method _create_prerequisites (line 600) | def _create_prerequisites(self, guide: HowToGuide) -> str: method _create_steps_section (line 635) | def _create_steps_section(self, steps: list[WorkflowStep]) -> str: method _create_complete_example (line 675) | def _create_complete_example(self, guide: HowToGuide) -> str: method _create_troubleshooting (line 706) | def _create_troubleshooting(self, guide: HowToGuide) -> str: method _create_next_steps (line 729) | def _create_next_steps(self, guide: HowToGuide) -> str: method _create_footer (line 751) | def _create_footer(self, guide: HowToGuide) -> str: method generate_index (line 761) | def generate_index(self, guides: list[HowToGuide]) -> str: class HowToGuideBuilder (line 821) | class HowToGuideBuilder: method __init__ (line 824) | def __init__(self, enhance_with_ai: bool = True): method build_guides_from_examples (line 836) | def build_guides_from_examples( method _extract_workflow_examples (line 910) | def _extract_workflow_examples(self, examples: list[dict]) -> list[dict]: method _create_guide (line 914) | def _create_guide(self, title: str, workflows: list[dict], enhancer=No... method _generate_overview (line 983) | def _generate_overview(self, primary_workflow: dict, _all_workflows: l... method _enhance_guide_with_ai (line 1001) | def _enhance_guide_with_ai(self, guide: HowToGuide, _ai_analysis: dict... method _enhance_guide_with_ai_basic (line 1054) | def _enhance_guide_with_ai_basic(self, guide: HowToGuide, ai_analysis:... method _create_collection (line 1082) | def _create_collection(self, guides: list[HowToGuide]) -> GuideCollect... method _save_guides_to_files (line 1102) | def _save_guides_to_files(self, collection: GuideCollection, output_di... function main (line 1136) | def main(): FILE: src/skill_seekers/cli/html_scraper.py function infer_description_from_html (line 36) | def infer_description_from_html(metadata: dict | None = None, name: str ... function _collect_html_files (line 61) | def _collect_html_files(html_path: str) -> list[Path]: class HtmlToSkillConverter (line 98) | class HtmlToSkillConverter: method __init__ (line 115) | def __init__(self, config: dict) -> None: method extract_html (line 146) | def extract_html(self) -> bool: method _extract_metadata (line 281) | def _extract_metadata(self, soup: BeautifulSoup, file_path: Path) -> d... method _clean_soup (line 347) | def _clean_soup(self, soup: BeautifulSoup) -> None: method _find_main_content (line 401) | def _find_main_content(self, soup: BeautifulSoup) -> Tag | BeautifulSoup: method _extract_sections (line 470) | def _extract_sections( method _build_section (line 538) | def _build_section( method _extract_code_blocks (line 657) | def _extract_code_blocks(self, elem: Tag) -> list[dict]: method _detect_language_from_classes (line 715) | def _detect_language_from_classes(self, elem: Tag) -> str: method _detect_language (line 780) | def _detect_language(self, code: str) -> str: method _extract_tables (line 835) | def _extract_tables(self, table_elem: Tag) -> dict | None: method _extract_image_info (line 879) | def _extract_image_info(self, img_elem: Tag, source_file: Path) -> dic... method _extract_link_info (line 908) | def _extract_link_info(self, a_elem: Tag, source_file: Path) -> dict |... method _resolve_relative_path (line 937) | def _resolve_relative_path(self, path: str, source_file: Path) -> str: method _html_to_text (line 967) | def _html_to_text(self, elem: Tag) -> str: method load_extracted_data (line 1076) | def load_extracted_data(self, json_path: str) -> bool: method categorize_content (line 1092) | def categorize_content(self) -> dict: method build_skill (line 1197) | def build_skill(self) -> None: method _generate_reference_file (line 1235) | def _generate_reference_file( method _generate_index (line 1354) | def _generate_index(self, categorized: dict) -> None: method _generate_skill_md (line 1414) | def _generate_skill_md(self, categorized: dict) -> None: method _format_key_concepts (line 1572) | def _format_key_concepts(self) -> str: method _format_patterns_from_content (line 1618) | def _format_patterns_from_content(self) -> str: method _sanitize_filename (line 1677) | def _sanitize_filename(self, name: str) -> str: function _score_code_quality (line 1699) | def _score_code_quality(code: str) -> float: function main (line 1752) | def main() -> int: FILE: src/skill_seekers/cli/incremental_updater.py class DocumentVersion (line 17) | class DocumentVersion: class ChangeSet (line 28) | class ChangeSet: method has_changes (line 37) | def has_changes(self) -> bool: method total_changes (line 42) | def total_changes(self) -> int: class UpdateMetadata (line 48) | class UpdateMetadata: class IncrementalUpdater (line 58) | class IncrementalUpdater: method __init__ (line 66) | def __init__(self, skill_dir: Path, version_file: str = ".skill_versio... method _compute_file_hash (line 79) | def _compute_file_hash(self, file_path: Path) -> str: method _scan_documents (line 100) | def _scan_documents(self) -> dict[str, DocumentVersion]: method load_previous_versions (line 136) | def load_previous_versions(self) -> bool: method save_current_versions (line 157) | def save_current_versions(self) -> None: method detect_changes (line 169) | def detect_changes(self) -> ChangeSet: method generate_update_package (line 219) | def generate_update_package( method generate_diff_report (line 285) | def generate_diff_report(self, change_set: ChangeSet) -> str: method apply_update_package (line 359) | def apply_update_package(self, package_path: Path) -> bool: function main (line 403) | def main(): FILE: src/skill_seekers/cli/install_agent.py function get_agent_path (line 50) | def get_agent_path(agent_name: str, project_root: Path | None = None) ->... function get_available_agents (line 86) | def get_available_agents() -> list: function validate_agent_name (line 96) | def validate_agent_name(agent_name: str) -> tuple[bool, str | None]: function validate_skill_directory (line 137) | def validate_skill_directory(skill_dir: Path) -> tuple[bool, str | None]: function install_to_agent (line 165) | def install_to_agent( function install_to_all_agents (line 311) | def install_to_all_agents( function main (line 337) | def main() -> int: FILE: src/skill_seekers/cli/install_skill.py function main (line 43) | def main(): FILE: src/skill_seekers/cli/jupyter_scraper.py function _check_jupyter_deps (line 163) | def _check_jupyter_deps(): function infer_description_from_notebook (line 173) | def infer_description_from_notebook(metadata: dict | None = None, name: ... class JupyterToSkillConverter (line 202) | class JupyterToSkillConverter: method __init__ (line 205) | def __init__(self, config: dict): method extract_notebook (line 221) | def extract_notebook(self) -> bool: method _collect_notebook_files (line 321) | def _collect_notebook_files(self, path: Path) -> list[Path]: method _parse_single_notebook (line 332) | def _parse_single_notebook(self, nb_path: Path) -> dict: method _parse_markdown_cell (line 370) | def _parse_markdown_cell( method _build_markdown_section (line 414) | def _build_markdown_section( method _parse_code_cell (line 460) | def _parse_code_cell( method _parse_raw_cell (line 527) | def _parse_raw_cell( method _infer_code_heading (line 546) | def _infer_code_heading(self, source: str, execution_count: int | None... method _detect_language (line 570) | def _detect_language(self, metadata: dict) -> str: method _extract_imports (line 601) | def _extract_imports(self, source: str, language: str) -> list[str]: method load_extracted_data (line 619) | def load_extracted_data(self, json_path: str) -> bool: method categorize_content (line 628) | def categorize_content(self) -> dict[str, dict]: method _section_text (line 705) | def _section_text(self, section: dict) -> str: method _print_categories (line 712) | def _print_categories(self, categorized: dict[str, dict]) -> None: method build_skill (line 717) | def build_skill(self) -> None: method _nb_basename (line 738) | def _nb_basename(self) -> str: method _ref_filename (line 744) | def _ref_filename(self, sections: list[dict], section_num: int, total_... method _generate_reference_file (line 757) | def _generate_reference_file( method _generate_index (line 819) | def _generate_index(self, categorized: dict[str, dict]) -> None: method _generate_skill_md (line 867) | def _generate_skill_md(self, categorized: dict[str, dict]) -> None: method _format_key_concepts (line 972) | def _format_key_concepts(self) -> str: method _format_patterns_from_content (line 995) | def _format_patterns_from_content(self) -> str: method _sanitize_filename (line 1045) | def _sanitize_filename(self, name: str) -> str: function _score_code_quality (line 1056) | def _score_code_quality(code: str) -> float: function main (line 1092) | def main() -> int: FILE: src/skill_seekers/cli/language_detector.py class LanguageDetector (line 502) | class LanguageDetector: method __init__ (line 523) | def __init__(self, min_confidence: float = 0.15): method _compile_patterns (line 535) | def _compile_patterns(self) -> None: method detect_from_html (line 567) | def detect_from_html(self, elem, code: str) -> tuple[str, float]: method detect_from_code (line 594) | def detect_from_code(self, code: str) -> tuple[str, float]: method extract_language_from_classes (line 624) | def extract_language_from_classes(self, classes: list[str]) -> str | N... method _calculate_confidence (line 670) | def _calculate_confidence(self, code: str) -> dict[str, float]: FILE: src/skill_seekers/cli/llms_txt_detector.py class LlmsTxtDetector (line 9) | class LlmsTxtDetector: method __init__ (line 14) | def __init__(self, base_url: str): method detect (line 17) | def detect(self) -> dict[str, str] | None: method detect_all (line 35) | def detect_all(self) -> list[dict[str, str]]: method _check_url_exists (line 54) | def _check_url_exists(self, url: str) -> bool: FILE: src/skill_seekers/cli/llms_txt_downloader.py class LlmsTxtDownloader (line 8) | class LlmsTxtDownloader: method __init__ (line 11) | def __init__(self, url: str, timeout: int = 30, max_retries: int = 3): method get_proper_filename (line 16) | def get_proper_filename(self) -> str: method _is_markdown (line 40) | def _is_markdown(self, content: str) -> bool: method download (line 63) | def download(self) -> str | None: FILE: src/skill_seekers/cli/llms_txt_parser.py class LlmsTxtParser (line 9) | class LlmsTxtParser: method __init__ (line 12) | def __init__(self, content: str, base_url: str = None): method extract_urls (line 16) | def extract_urls(self) -> list[str]: method _clean_url (line 59) | def _clean_url(self, url: str) -> str: method parse (line 100) | def parse(self) -> list[dict]: method _parse_section (line 126) | def _parse_section(self, content: str, title: str) -> dict: FILE: src/skill_seekers/cli/main.py function create_parser (line 97) | def create_parser() -> argparse.ArgumentParser: function _reconstruct_argv (line 143) | def _reconstruct_argv(command: str, args: argparse.Namespace) -> list[str]: function main (line 198) | def main(argv: list[str] | None = None) -> int: function _handle_analyze_command (line 270) | def _handle_analyze_command(args: argparse.Namespace) -> int: FILE: src/skill_seekers/cli/man_scraper.py function infer_description_from_manpages (line 82) | def infer_description_from_manpages( class ManPageToSkillConverter (line 119) | class ManPageToSkillConverter: method __init__ (line 128) | def __init__(self, config: dict) -> None: method extract_manpages (line 163) | def extract_manpages(self) -> bool: method _extract_from_names (line 240) | def _extract_from_names(self, names: list[str]) -> list[dict]: method _extract_from_directory (line 267) | def _extract_from_directory(self, dir_path: str) -> list[dict]: method _section_from_suffix (line 332) | def _section_from_suffix(suffix: str) -> int | None: method _run_man_command (line 352) | def _run_man_command(self, name: str, section: int | None = None) -> s... method _read_man_file (line 431) | def _read_man_file(self, filepath: str) -> str | None: method _strip_troff_formatting (line 473) | def _strip_troff_formatting(text: str) -> str: method _parse_man_output (line 584) | def _parse_man_output( method _extract_options (line 654) | def _extract_options(self, options_text: str) -> list[dict]: method _extract_examples (line 713) | def _extract_examples(self, examples_text: str) -> list[dict]: method _extract_see_also (line 786) | def _extract_see_also(self, see_also_text: str) -> list[str]: method load_extracted_data (line 812) | def load_extracted_data(self, json_path: str) -> bool: method categorize_content (line 832) | def categorize_content(self) -> dict[str, dict]: method build_skill (line 931) | def build_skill(self) -> None: method _generate_reference_file (line 968) | def _generate_reference_file( method _generate_index (line 1078) | def _generate_index(self, categorized: dict[str, dict]) -> None: method _generate_skill_md (line 1121) | def _generate_skill_md(self, categorized: dict[str, dict]) -> None: method _sanitize_filename (line 1276) | def _sanitize_filename(name: str) -> str: function main (line 1295) | def main() -> int: FILE: src/skill_seekers/cli/markdown_cleaner.py class MarkdownCleaner (line 12) | class MarkdownCleaner: method remove_html_tags (line 16) | def remove_html_tags(text: str) -> str: method extract_first_section (line 38) | def extract_first_section(text: str, max_chars: int = 500) -> str: method _truncate_at_sentence (line 104) | def _truncate_at_sentence(text: str, max_chars: int) -> str: FILE: src/skill_seekers/cli/merge_sources.py function categorize_issues_by_topic (line 41) | def categorize_issues_by_topic( function generate_hybrid_content (line 89) | def generate_hybrid_content( function _match_issues_to_apis (line 171) | def _match_issues_to_apis( class RuleBasedMerger (line 215) | class RuleBasedMerger: method __init__ (line 232) | def __init__( method merge_all (line 282) | def merge_all(self) -> dict[str, Any]: method _merge_single_api (line 337) | def _merge_single_api(self, api_name: str) -> dict[str, Any]: method _create_merged_signature (line 410) | def _create_merged_signature(self, code_info: dict, docs_info: dict) -... class ClaudeEnhancedMerger (line 443) | class ClaudeEnhancedMerger: method __init__ (line 457) | def __init__( method merge_all (line 481) | def merge_all(self) -> dict[str, Any]: method _create_workspace (line 511) | def _create_workspace(self) -> str: method _write_context_files (line 526) | def _write_context_files(self, workspace: str): method _count_by_field (line 620) | def _count_by_field(self, field: str) -> dict[str, int]: method _launch_claude_merge (line 628) | def _launch_claude_merge(self, workspace: str): method _read_merged_results (line 698) | def _read_merged_results(self, workspace: str) -> dict[str, Any]: function merge_sources (line 711) | def merge_sources( FILE: src/skill_seekers/cli/multilang_support.py class LanguageInfo (line 16) | class LanguageInfo: class TranslationStatus (line 26) | class TranslationStatus: class LanguageDetector (line 36) | class LanguageDetector: method detect (line 122) | def detect(self, text: str, sample_size: int = 2000) -> LanguageInfo: method detect_from_filename (line 165) | def detect_from_filename(self, filename: str) -> str | None: class MultiLanguageManager (line 194) | class MultiLanguageManager: method __init__ (line 201) | def __init__(self): method add_document (line 207) | def add_document( method get_languages (line 268) | def get_languages(self) -> list[str]: method get_document_count (line 272) | def get_document_count(self, language: str | None = None) -> int: method get_translation_status (line 286) | def get_translation_status(self, base_language: str | None = None) -> ... method export_by_language (line 330) | def export_by_language(self, output_dir: Path) -> dict[str, Path]: method generate_translation_report (line 360) | def generate_translation_report(self) -> str: function main (line 407) | def main(): FILE: src/skill_seekers/cli/notion_scraper.py function _check_notion_deps (line 47) | def _check_notion_deps() -> None: function infer_description_from_notion (line 57) | def infer_description_from_notion(metadata: dict | None = None, name: st... class NotionToSkillConverter (line 74) | class NotionToSkillConverter: method __init__ (line 82) | def __init__(self, config: dict) -> None: method _get_client (line 102) | def _get_client(self) -> Any: method extract_notion (line 114) | def extract_notion(self) -> bool: method load_extracted_data (line 152) | def load_extracted_data(self, json_path: str | None = None) -> bool: method categorize_content (line 166) | def categorize_content(self) -> dict[str, dict[str, Any]]: method _resolve_category_key (line 186) | def _resolve_category_key(self, properties: dict[str, Any], parent_pat... method _sanitize_key (line 201) | def _sanitize_key(text: str) -> str: method build_skill (line 208) | def build_skill(self) -> None: method _generate_reference_file (line 225) | def _generate_reference_file( method _generate_index (line 253) | def _generate_index(self, categorized: dict[str, dict[str, Any]]) -> N... method _generate_skill_md (line 268) | def _generate_skill_md(self, categorized: dict[str, dict[str, Any]]) -... method _collect_key_topics (line 337) | def _collect_key_topics(self) -> list[str]: method _collect_code_blocks (line 350) | def _collect_code_blocks(self) -> list[dict[str, str]]: method _collect_property_summary (line 356) | def _collect_property_summary(self) -> dict[str, set[str]]: method _extract_via_api (line 372) | def _extract_via_api(self) -> list[dict[str, Any]]: method _extract_database_entries (line 381) | def _extract_database_entries(self, client: Any) -> list[dict[str, Any]]: method _process_database_entry (line 422) | def _process_database_entry(self, client: Any, entry: dict[str, Any]) ... method _extract_properties (line 445) | def _extract_properties(self, raw: dict[str, Any]) -> dict[str, Any]: method _extract_property_value (line 457) | def _extract_property_value(self, ptype: str, data: dict[str, Any]) ->... method _extract_page_tree (line 499) | def _extract_page_tree( method _get_child_pages (line 549) | def _get_child_pages(self, client: Any, page_id: str) -> list[str]: method _fetch_page_blocks (line 571) | def _fetch_page_blocks( method _parse_notion_blocks (line 603) | def _parse_notion_blocks( method _handle_block_type (line 621) | def _handle_block_type( method _handle_table_block (line 702) | def _handle_table_block(self, block: dict[str, Any]) -> str: method _extract_rich_text (line 719) | def _extract_rich_text(self, rich_text_list: list[dict[str, Any]]) -> ... method _extract_from_export (line 748) | def _extract_from_export(self) -> list[dict[str, Any]]: method _parse_export_markdown (line 782) | def _parse_export_markdown(self, filepath: Path, parent_path: str) -> ... method _parse_export_csv (line 821) | def _parse_export_csv(self, filepath: Path, parent_path: str) -> list[... method _clean_notion_export_title (line 856) | def _clean_notion_export_title(stem: str) -> str: function main (line 867) | def main() -> int: FILE: src/skill_seekers/cli/openapi_scraper.py function _check_yaml_deps (line 53) | def _check_yaml_deps(): function infer_description_from_spec (line 63) | def infer_description_from_spec(info: dict | None = None, name: str = ""... class OpenAPIToSkillConverter (line 93) | class OpenAPIToSkillConverter: method __init__ (line 114) | def __init__(self, config: dict) -> None: method extract_spec (line 149) | def extract_spec(self) -> bool: method _load_from_file (line 215) | def _load_from_file(self, path: str) -> dict[str, Any]: method _load_from_url (line 242) | def _load_from_url(self, url: str) -> dict[str, Any]: method _parse_content (line 279) | def _parse_content(self, content: str, source: str) -> dict[str, Any]: method _detect_version (line 313) | def _detect_version(self, spec: dict[str, Any]) -> str: method load_extracted_data (line 342) | def load_extracted_data(self, json_path: str | None = None) -> bool: method _parse_openapi_3 (line 372) | def _parse_openapi_3(self, spec: dict[str, Any]) -> dict[str, Any]: method _parse_swagger_2 (line 434) | def _parse_swagger_2(self, spec: dict[str, Any]) -> dict[str, Any]: method _extract_info (line 507) | def _extract_info(self, spec: dict[str, Any]) -> dict[str, Any]: method _extract_endpoints (line 536) | def _extract_endpoints(self, spec: dict[str, Any], version: int) -> li... method _normalize_parameter (line 617) | def _normalize_parameter( method _normalize_request_body_v3 (line 666) | def _normalize_request_body_v3( method _normalize_response (line 695) | def _normalize_response( method _extract_schemas (line 747) | def _extract_schemas( method _flatten_schema (line 769) | def _flatten_schema( method _extract_security (line 851) | def _extract_security(self, security_dict: dict[str, Any], version: in... method _resolve_ref (line 896) | def _resolve_ref(self, obj: dict[str, Any], spec: dict[str, Any]) -> d... method categorize_content (line 943) | def categorize_content(self) -> dict[str, list[dict[str, Any]]]: method build_skill (line 986) | def build_skill(self) -> None: method _generate_reference_file (line 1026) | def _generate_reference_file(self, cat_name: str, endpoints: list[dict... method _generate_schemas_reference (line 1056) | def _generate_schemas_reference(self, schemas: dict[str, Any]) -> None: method _generate_security_reference (line 1080) | def _generate_security_reference(self, security_schemes: dict[str, Any... method _generate_index (line 1159) | def _generate_index(self, categories: dict[str, list[dict[str, Any]]])... method _generate_skill_md (line 1213) | def _generate_skill_md(self, categories: dict[str, list[dict[str, Any]... method _format_endpoint_md (line 1425) | def _format_endpoint_md(self, endpoint: dict[str, Any]) -> str: method _format_schema_md (line 1548) | def _format_schema_md(self, schema_name: str, schema: dict[str, Any]) ... method _render_schema_block (line 1637) | def _render_schema_block(self, schema: dict[str, Any], indent: int = 0... method _schema_type_string (line 1694) | def _schema_type_string(self, schema: dict[str, Any]) -> str: method _get_tag_description (line 1746) | def _get_tag_description(self, tag_name: str) -> str: method _sanitize_filename (line 1760) | def _sanitize_filename(self, name: str) -> str: function main (line 1782) | def main() -> int: FILE: src/skill_seekers/cli/package_multi.py function package_skill (line 14) | def package_skill(skill_dir: Path) -> bool: function main (line 28) | def main(): FILE: src/skill_seekers/cli/package_skill.py function package_skill (line 40) | def package_skill( function main (line 196) | def main(): FILE: src/skill_seekers/cli/parsers/__init__.py function register_parsers (line 89) | def register_parsers(subparsers): function get_parser_names (line 102) | def get_parser_names(): FILE: src/skill_seekers/cli/parsers/analyze_parser.py class AnalyzeParser (line 13) | class AnalyzeParser(SubcommandParser): method name (line 17) | def name(self) -> str: method help (line 21) | def help(self) -> str: method description (line 25) | def description(self) -> str: method add_arguments (line 28) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/asciidoc_parser.py class AsciiDocParser (line 11) | class AsciiDocParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/base.py class SubcommandParser (line 7) | class SubcommandParser(ABC): method name (line 19) | def name(self) -> str: method help (line 25) | def help(self) -> str: method description (line 30) | def description(self) -> str: method add_arguments (line 35) | def add_arguments(self, parser: argparse.ArgumentParser) -> None: method create_parser (line 43) | def create_parser(self, subparsers) -> argparse.ArgumentParser: FILE: src/skill_seekers/cli/parsers/chat_parser.py class ChatParser (line 11) | class ChatParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/config_parser.py class ConfigParser (line 6) | class ConfigParser(SubcommandParser): method name (line 10) | def name(self) -> str: method help (line 14) | def help(self) -> str: method description (line 18) | def description(self) -> str: method add_arguments (line 21) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/confluence_parser.py class ConfluenceParser (line 11) | class ConfluenceParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/create_parser.py class CreateParser (line 17) | class CreateParser(SubcommandParser): method name (line 21) | def name(self) -> str: method help (line 25) | def help(self) -> str: method description (line 29) | def description(self) -> str: method add_arguments (line 48) | def add_arguments(self, parser): method register (line 105) | def register(self, subparsers): FILE: src/skill_seekers/cli/parsers/enhance_parser.py class EnhanceParser (line 11) | class EnhanceParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 30) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/enhance_status_parser.py class EnhanceStatusParser (line 6) | class EnhanceStatusParser(SubcommandParser): method name (line 10) | def name(self) -> str: method help (line 14) | def help(self) -> str: method description (line 18) | def description(self) -> str: method add_arguments (line 21) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/epub_parser.py class EpubParser (line 11) | class EpubParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/estimate_parser.py class EstimateParser (line 6) | class EstimateParser(SubcommandParser): method name (line 10) | def name(self) -> str: method help (line 14) | def help(self) -> str: method description (line 18) | def description(self) -> str: method add_arguments (line 21) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/extractors/base_parser.py class ParseResult (line 21) | class ParseResult: method is_ok (line 30) | def is_ok(self) -> bool: class BaseParser (line 35) | class BaseParser(ABC): method __init__ (line 46) | def __init__(self, options: dict[str, Any] | None = None): method format_name (line 68) | def format_name(self) -> str: method supported_extensions (line 74) | def supported_extensions(self) -> list[str]: method can_parse (line 78) | def can_parse(self, source: str | Path) -> bool: method parse (line 100) | def parse(self, source: str | Path) -> ParseResult: method parse_file (line 147) | def parse_file(self, path: str | Path) -> ParseResult: method parse_string (line 151) | def parse_string(self, content: str, source_path: str = "") ->... method _parse_content (line 176) | def _parse_content(self, content: str, source_path: str) -> Document: method _detect_format (line 190) | def _detect_format(self, content: str) -> bool: method _read_source (line 202) | def _read_source(self, source: str | Path) -> str: method _read_source_with_path (line 207) | def _read_source_with_path(self, source: str | Path) -> tuple[str, str]: method _post_process (line 223) | def _post_process(self, document: Document) -> Document: method _extract_headings (line 252) | def _extract_headings(self, document: Document) -> list: method _extract_code_blocks (line 264) | def _extract_code_blocks(self, document: Document) -> list: method _extract_tables (line 272) | def _extract_tables(self, document: Document) -> list: method _create_quality_scorer (line 280) | def _create_quality_scorer(self): function get_parser_for_file (line 289) | def get_parser_for_file(path: str | Path) -> BaseParser | None: function parse_document (line 321) | def parse_document(source: str | Path, format_hint: str | None = None) -... FILE: src/skill_seekers/cli/parsers/extractors/formatters.py class MarkdownFormatter (line 19) | class MarkdownFormatter: method __init__ (line 22) | def __init__(self, options: dict[str, Any] = None): method format (line 29) | def format(self, document: Document) -> str: method _format_metadata (line 53) | def _format_metadata(self, meta: dict) -> str: method _format_toc (line 66) | def _format_toc(self, headings: list) -> str: method _format_block (line 77) | def _format_block(self, block: ContentBlock) -> str: method _format_heading (line 101) | def _format_heading(self, block: ContentBlock) -> str: method _format_paragraph (line 116) | def _format_paragraph(self, block: ContentBlock) -> str: method _format_code_block (line 120) | def _format_code_block(self, block: ContentBlock) -> str: method _format_table (line 138) | def _format_table(self, block: ContentBlock) -> str: method _format_table_data (line 146) | def _format_table_data(self, table: Table) -> str: method _format_list (line 172) | def _format_list(self, block: ContentBlock) -> str: method _format_image (line 188) | def _format_image(self, block: ContentBlock) -> str: method _format_cross_ref (line 200) | def _format_cross_ref(self, block: ContentBlock) -> str: method _format_admonition (line 210) | def _format_admonition(self, block: ContentBlock) -> str: method _format_directive (line 228) | def _format_directive(self, block: ContentBlock) -> str: method _format_field_list (line 240) | def _format_field_list(self, block: ContentBlock) -> str: method _format_definition_list (line 255) | def _format_definition_list(self, block: ContentBlock) -> str: method _format_meta (line 271) | def _format_meta(self, block: ContentBlock) -> str: class SkillFormatter (line 276) | class SkillFormatter: method format (line 279) | def format(self, document: Document) -> dict[str, Any]: method _extract_summary (line 326) | def _extract_summary(self, document: Document, max_length: int = 500) ... method _score_table (line 341) | def _score_table(self, table: Table) -> float: FILE: src/skill_seekers/cli/parsers/extractors/markdown_parser.py class MarkdownParser (line 39) | class MarkdownParser(BaseParser): method __init__ (line 58) | def __init__(self, options: dict[str, Any] | None = None): method format_name (line 65) | def format_name(self) -> str: method supported_extensions (line 69) | def supported_extensions(self) -> list[str]: method _detect_format (line 72) | def _detect_format(self, content: str) -> bool: method _parse_content (line 84) | def _parse_content(self, content: str, source_path: str) -> Document: method _parse_frontmatter (line 123) | def _parse_frontmatter(self) -> dict | None: method _parse_block (line 196) | def _parse_block(self) -> ContentBlock | None: method _is_setext_header (line 249) | def _is_setext_header(self, line: int) -> bool: method _parse_atx_header (line 263) | def _parse_atx_header(self) -> ContentBlock: method _parse_setext_header (line 292) | def _parse_setext_header(self) -> ContentBlock: method _parse_code_fence (line 317) | def _parse_code_fence(self) -> ContentBlock: method _parse_indented_code (line 365) | def _parse_indented_code(self) -> ContentBlock: method _is_table (line 412) | def _is_table(self, line: int) -> bool: method _parse_table (line 423) | def _parse_table(self) -> ContentBlock: method _parse_blockquote (line 472) | def _parse_blockquote(self) -> ContentBlock: method _parse_html_comment (line 523) | def _parse_html_comment(self) -> ContentBlock | None: method _parse_horizontal_rule (line 539) | def _parse_horizontal_rule(self) -> ContentBlock: method _detect_list_type (line 548) | def _detect_list_type(self, stripped: str) -> ListType | None: method _parse_list (line 556) | def _parse_list(self, list_type: ListType) -> ContentBlock: method _parse_paragraph (line 595) | def _parse_paragraph(self) -> ContentBlock: method _process_inline (line 638) | def _process_inline(self, text: str) -> str: method _create_anchor (line 662) | def _create_anchor(self, text: str) -> str: method _extract_specialized_content (line 670) | def _extract_specialized_content(self, document: Document): FILE: src/skill_seekers/cli/parsers/extractors/pdf_parser.py class PdfParser (line 33) | class PdfParser(BaseParser): method __init__ (line 42) | def __init__(self, options: dict[str, Any] | None = None): method format_name (line 60) | def format_name(self) -> str: method supported_extensions (line 64) | def supported_extensions(self) -> list[str]: method _detect_format (line 67) | def _detect_format(self, content: str) -> bool: method _parse_content (line 71) | def _parse_content(self, content: str, source_path: str) -> Document: method parse_file (line 81) | def parse_file(self, path: str | Path) -> ParseResult: method _convert_to_document (line 138) | def _convert_to_document(self, extraction_result: dict, source_path: s... method parse (line 266) | def parse(self, source: str | Path) -> ParseResult: FILE: src/skill_seekers/cli/parsers/extractors/quality_scorer.py class QualityScorer (line 15) | class QualityScorer: method score_code_block (line 151) | def score_code_block(self, code: str, language: str | None = None) -> ... method _validate_syntax (line 234) | def _validate_syntax(self, code: str, language: str | None) -> tuple[b... method score_table (line 274) | def score_table(self, table: Table) -> float: method score_content_block (line 326) | def score_content_block(self, block: ContentBlock) -> float: method detect_language (line 348) | def detect_language(self, code: str) -> tuple[str, float]: FILE: src/skill_seekers/cli/parsers/extractors/rst_parser.py class RstParser (line 41) | class RstParser(BaseParser): method __init__ (line 116) | def __init__(self, options: dict[str, Any] | None = None): method format_name (line 124) | def format_name(self) -> str: method supported_extensions (line 128) | def supported_extensions(self) -> list[str]: method _detect_format (line 131) | def _detect_format(self, content: str) -> bool: method _parse_content (line 141) | def _parse_content(self, content: str, source_path: str) -> Document: method _collect_substitutions (line 180) | def _collect_substitutions(self): method _parse_block (line 190) | def _parse_block(self) -> ContentBlock | None: method _is_header (line 240) | def _is_header(self, line: int) -> bool: method _parse_header (line 262) | def _parse_header(self) -> ContentBlock: method _parse_directive (line 291) | def _parse_directive(self) -> ContentBlock: method _parse_admonition_directive (line 362) | def _parse_admonition_directive( method _parse_code_block_directive (line 382) | def _parse_code_block_directive(self, language: str, content: str, lin... method _parse_table_directive (line 413) | def _parse_table_directive(self, caption: str, content: str, line: int... method _parse_simple_table (line 433) | def _parse_simple_table(self, content: str, caption: str | None, line:... method _parse_grid_table (line 546) | def _parse_grid_table(self, content: str, caption: str | None, line: i... method _parse_list_table_directive (line 586) | def _parse_list_table_directive(self, caption: str, content: str, line... method _parse_toctree_directive (line 642) | def _parse_toctree_directive(self, content: str, line: int) -> Content... method _parse_image_directive (line 661) | def _parse_image_directive(self, argument: str, content: str, line: in... method _is_definition_list (line 693) | def _is_definition_list(self, line: int) -> bool: method _parse_definition_list (line 706) | def _parse_definition_list(self) -> ContentBlock: method _is_field_list (line 767) | def _is_field_list(self, line: int) -> bool: method _parse_field_list (line 774) | def _parse_field_list(self) -> ContentBlock: method _parse_bullet_list (line 840) | def _parse_bullet_list(self) -> ContentBlock: method _parse_numbered_list (line 871) | def _parse_numbered_list(self) -> ContentBlock: method _parse_paragraph (line 902) | def _parse_paragraph(self) -> ContentBlock: method _process_inline_markup (line 945) | def _process_inline_markup(self, text: str) -> str: method _extract_specialized_content (line 969) | def _extract_specialized_content(self, document: Document): method _extract_xrefs_from_text (line 1031) | def _extract_xrefs_from_text(self, text: str, source_line: int | None)... FILE: src/skill_seekers/cli/parsers/extractors/unified_structure.py class ContentBlockType (line 14) | class ContentBlockType(Enum): class CrossRefType (line 35) | class CrossRefType(Enum): class AdmonitionType (line 53) | class AdmonitionType(Enum): class ListType (line 70) | class ListType(Enum): class Heading (line 79) | class Heading: class CodeBlock (line 89) | class CodeBlock: class Table (line 103) | class Table: method num_rows (line 115) | def num_rows(self) -> int: method num_cols (line 119) | def num_cols(self) -> int: class CrossReference (line 126) | class CrossReference: class Field (line 137) | class Field: class DefinitionItem (line 147) | class DefinitionItem: class Image (line 157) | class Image: class ContentBlock (line 169) | class ContentBlock: class ExtractionStats (line 189) | class ExtractionStats: class Document (line 203) | class Document: method to_markdown (line 243) | def to_markdown(self, options: dict | None = None) -> str: method to_skill_format (line 262) | def to_skill_format(self) -> dict[str, Any]: method _extract_content_text (line 308) | def _extract_content_text(self) -> str: method get_section_content (line 316) | def get_section_content(self, heading_text: str) -> list[ContentBlock]: method find_blocks_by_type (line 346) | def find_blocks_by_type(self, block_type: ContentBlockType) -> list[Co... method find_code_by_language (line 350) | def find_code_by_language(self, language: str) -> list[CodeBlock]: method find_tables_by_caption (line 354) | def find_tables_by_caption(self, pattern: str) -> list[Table]: method get_api_summary (line 360) | def get_api_summary(self) -> dict[str, Any]: method _parse_api_table (line 388) | def _parse_api_table(self, table: Table | None) -> list[dict]: function merge_documents (line 407) | def merge_documents(docs: list[Document]) -> Document: FILE: src/skill_seekers/cli/parsers/github_parser.py class GitHubParser (line 11) | class GitHubParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/html_parser.py class HtmlParser (line 11) | class HtmlParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/install_agent_parser.py class InstallAgentParser (line 6) | class InstallAgentParser(SubcommandParser): method name (line 10) | def name(self) -> str: method help (line 14) | def help(self) -> str: method description (line 18) | def description(self) -> str: method add_arguments (line 21) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/install_parser.py class InstallParser (line 6) | class InstallParser(SubcommandParser): method name (line 10) | def name(self) -> str: method help (line 14) | def help(self) -> str: method description (line 18) | def description(self) -> str: method add_arguments (line 21) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/jupyter_parser.py class JupyterParser (line 11) | class JupyterParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/manpage_parser.py class ManPageParser (line 11) | class ManPageParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/multilang_parser.py class MultilangParser (line 6) | class MultilangParser(SubcommandParser): method name (line 10) | def name(self) -> str: method help (line 14) | def help(self) -> str: method description (line 18) | def description(self) -> str: method add_arguments (line 21) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/notion_parser.py class NotionParser (line 11) | class NotionParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/openapi_parser.py class OpenAPIParser (line 11) | class OpenAPIParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/package_parser.py class PackageParser (line 11) | class PackageParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/pdf_parser.py class PDFParser (line 11) | class PDFParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/pptx_parser.py class PptxParser (line 11) | class PptxParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/quality_parser.py class QualityParser (line 6) | class QualityParser(SubcommandParser): method name (line 10) | def name(self) -> str: method help (line 14) | def help(self) -> str: method description (line 18) | def description(self) -> str: method add_arguments (line 21) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/resume_parser.py class ResumeParser (line 6) | class ResumeParser(SubcommandParser): method name (line 10) | def name(self) -> str: method help (line 14) | def help(self) -> str: method description (line 18) | def description(self) -> str: method add_arguments (line 21) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/rss_parser.py class RssParser (line 11) | class RssParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/scrape_parser.py class ScrapeParser (line 11) | class ScrapeParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/stream_parser.py class StreamParser (line 6) | class StreamParser(SubcommandParser): method name (line 10) | def name(self) -> str: method help (line 14) | def help(self) -> str: method description (line 18) | def description(self) -> str: method add_arguments (line 21) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/sync_config_parser.py class SyncConfigParser (line 8) | class SyncConfigParser(SubcommandParser): method name (line 12) | def name(self) -> str: method help (line 16) | def help(self) -> str: method description (line 20) | def description(self) -> str: method add_arguments (line 27) | def add_arguments(self, parser: argparse.ArgumentParser) -> None: FILE: src/skill_seekers/cli/parsers/test_examples_parser.py class TestExamplesParser (line 6) | class TestExamplesParser(SubcommandParser): method name (line 10) | def name(self) -> str: method help (line 14) | def help(self) -> str: method description (line 18) | def description(self) -> str: method add_arguments (line 21) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/unified_parser.py class UnifiedParser (line 11) | class UnifiedParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/update_parser.py class UpdateParser (line 6) | class UpdateParser(SubcommandParser): method name (line 10) | def name(self) -> str: method help (line 14) | def help(self) -> str: method description (line 18) | def description(self) -> str: method add_arguments (line 21) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/upload_parser.py class UploadParser (line 11) | class UploadParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/video_parser.py class VideoParser (line 11) | class VideoParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/word_parser.py class WordParser (line 11) | class WordParser(SubcommandParser): method name (line 15) | def name(self) -> str: method help (line 19) | def help(self) -> str: method description (line 23) | def description(self) -> str: method add_arguments (line 26) | def add_arguments(self, parser): FILE: src/skill_seekers/cli/parsers/workflows_parser.py class WorkflowsParser (line 6) | class WorkflowsParser(SubcommandParser): method name (line 10) | def name(self) -> str: method help (line 14) | def help(self) -> str: method description (line 18) | def description(self) -> str: method add_arguments (line 25) | def add_arguments(self, parser) -> None: FILE: src/skill_seekers/cli/pattern_recognizer.py class PatternInstance (line 44) | class PatternInstance: method to_dict (line 58) | def to_dict(self) -> dict: class PatternReport (line 77) | class PatternReport: method to_dict (line 87) | def to_dict(self) -> dict: method get_summary (line 99) | def get_summary(self) -> dict[str, int]: class BasePatternDetector (line 107) | class BasePatternDetector: method __init__ (line 110) | def __init__(self, depth: str = "deep"): method detect_surface (line 121) | def detect_surface(self, _class_sig, _all_classes: list) -> PatternIns... method detect_deep (line 135) | def detect_deep(self, _class_sig, _all_classes: list) -> PatternInstan... method detect_full (line 149) | def detect_full( method detect (line 166) | def detect( class PatternRecognizer (line 202) | class PatternRecognizer: method __init__ (line 209) | def __init__(self, depth: str = "deep", enhance_with_ai: bool = True): method _register_detectors (line 233) | def _register_detectors(self): method analyze_file (line 251) | def analyze_file(self, file_path: str, content: str, language: str) ->... method _convert_to_signatures (line 328) | def _convert_to_signatures(self, classes: list[dict]): class SingletonDetector (line 377) | class SingletonDetector(BasePatternDetector): method __init__ (line 394) | def __init__(self, depth: str = "deep"): method detect_surface (line 399) | def detect_surface(self, class_sig, _all_classes: list) -> PatternInst... method detect_deep (line 413) | def detect_deep(self, class_sig, all_classes: list) -> PatternInstance... method detect_full (line 467) | def detect_full( class FactoryDetector (line 510) | class FactoryDetector(BasePatternDetector): method __init__ (line 527) | def __init__(self, depth: str = "deep"): method detect_surface (line 532) | def detect_surface(self, class_sig, _all_classes: list) -> PatternInst... method detect_deep (line 567) | def detect_deep(self, class_sig, all_classes: list) -> PatternInstance... class ObserverDetector (line 617) | class ObserverDetector(BasePatternDetector): method __init__ (line 635) | def __init__(self, depth: str = "deep"): method detect_surface (line 640) | def detect_surface(self, class_sig, _all_classes: list) -> PatternInst... method detect_deep (line 689) | def detect_deep(self, class_sig, all_classes: list) -> PatternInstance... class StrategyDetector (line 746) | class StrategyDetector(BasePatternDetector): method __init__ (line 764) | def __init__(self, depth: str = "deep"): method detect_surface (line 769) | def detect_surface(self, class_sig, _all_classes: list) -> PatternInst... method detect_deep (line 787) | def detect_deep(self, class_sig, all_classes: list) -> PatternInstance... class DecoratorDetector (line 849) | class DecoratorDetector(BasePatternDetector): method __init__ (line 867) | def __init__(self, depth: str = "deep"): method detect_surface (line 872) | def detect_surface(self, class_sig, _all_classes: list) -> PatternInst... method detect_deep (line 906) | def detect_deep(self, class_sig, all_classes: list) -> PatternInstance... class BuilderDetector (line 960) | class BuilderDetector(BasePatternDetector): method __init__ (line 978) | def __init__(self, depth: str = "deep"): method detect_surface (line 983) | def detect_surface(self, class_sig, _all_classes: list) -> PatternInst... method detect_deep (line 998) | def detect_deep(self, class_sig, all_classes: list) -> PatternInstance... method detect_full (line 1051) | def detect_full( class AdapterDetector (line 1091) | class AdapterDetector(BasePatternDetector): method __init__ (line 1109) | def __init__(self, depth: str = "deep"): method detect_surface (line 1114) | def detect_surface(self, class_sig, _all_classes: list) -> PatternInst... method detect_deep (line 1132) | def detect_deep(self, class_sig, all_classes: list) -> PatternInstance... class CommandDetector (line 1176) | class CommandDetector(BasePatternDetector): method __init__ (line 1194) | def __init__(self, depth: str = "deep"): method detect_surface (line 1199) | def detect_surface(self, class_sig, _all_classes: list) -> PatternInst... method detect_deep (line 1217) | def detect_deep(self, class_sig, all_classes: list) -> PatternInstance... class TemplateMethodDetector (line 1267) | class TemplateMethodDetector(BasePatternDetector): method __init__ (line 1285) | def __init__(self, depth: str = "deep"): method detect_surface (line 1290) | def detect_surface(self, class_sig, all_classes: list) -> PatternInsta... method detect_deep (line 1313) | def detect_deep(self, class_sig, all_classes: list) -> PatternInstance... class ChainOfResponsibilityDetector (line 1383) | class ChainOfResponsibilityDetector(BasePatternDetector): method __init__ (line 1401) | def __init__(self, depth: str = "deep"): method detect_surface (line 1406) | def detect_surface(self, class_sig, _all_classes: list) -> PatternInst... method detect_deep (line 1424) | def detect_deep(self, class_sig, all_classes: list) -> PatternInstance... class LanguageAdapter (line 1499) | class LanguageAdapter: method adapt_for_language (line 1508) | def adapt_for_language(pattern: PatternInstance, language: str) -> Pat... function filter_patterns_by_confidence (line 1655) | def filter_patterns_by_confidence(patterns: list[dict], min_confidence: ... function create_multi_level_report (line 1673) | def create_multi_level_report(pattern_results: list[dict]) -> dict: function main (line 1722) | def main(): FILE: src/skill_seekers/cli/pdf_extractor_poc.py class PDFExtractor (line 86) | class PDFExtractor: method __init__ (line 89) | def __init__( method log (line 130) | def log(self, message): method extract_text_with_ocr (line 135) | def extract_text_with_ocr(self, page): method extract_tables_from_page (line 172) | def extract_tables_from_page(self, page): method get_cached (line 208) | def get_cached(self, key): method set_cached (line 222) | def set_cached(self, key, value): method detect_language_from_code (line 233) | def detect_language_from_code(self, code): method validate_code_syntax (line 244) | def validate_code_syntax(self, code, language): method score_code_quality (line 308) | def score_code_quality(self, code, language, confidence): method detect_code_blocks_by_font (line 355) | def detect_code_blocks_by_font(self, page): method detect_code_blocks_by_indent (line 433) | def detect_code_blocks_by_indent(self, text): method detect_code_blocks_by_pattern (line 497) | def detect_code_blocks_by_pattern(self, text): method detect_chapter_start (line 545) | def detect_chapter_start(self, page_data): method merge_continued_code_blocks (line 577) | def merge_continued_code_blocks(self, pages): method create_chunks (line 629) | def create_chunks(self, pages): method extract_images_from_page (line 709) | def extract_images_from_page(self, page, page_num): method extract_page (line 773) | def extract_page(self, page_num): method extract_all (line 880) | def extract_all(self): function main (line 1057) | def main(): FILE: src/skill_seekers/cli/pdf_scraper.py function infer_description_from_pdf (line 26) | def infer_description_from_pdf(pdf_metadata: dict = None, name: str = ""... class PDFToSkillConverter (line 65) | class PDFToSkillConverter: method __init__ (line 68) | def __init__(self, config): method extract_pdf (line 90) | def extract_pdf(self): method load_extracted_data (line 120) | def load_extracted_data(self, json_path): method categorize_content (line 130) | def categorize_content(self): method build_skill (line 242) | def build_skill(self): method _generate_reference_file (line 271) | def _generate_reference_file(self, _cat_key, cat_data, section_num, to... method _generate_index (line 348) | def _generate_index(self, categorized): method _generate_skill_md (line 400) | def _generate_skill_md(self, categorized): method _format_key_concepts (line 530) | def _format_key_concepts(self) -> str: method _format_patterns_from_content (line 566) | def _format_patterns_from_content(self) -> str: method _sanitize_filename (line 628) | def _sanitize_filename(self, name): function main (line 636) | def main(): FILE: src/skill_seekers/cli/pptx_scraper.py function _check_pptx_deps (line 95) | def _check_pptx_deps() -> None: function infer_description_from_pptx (line 105) | def infer_description_from_pptx( class PptxToSkillConverter (line 150) | class PptxToSkillConverter: method __init__ (line 168) | def __init__(self, config: dict) -> None: method extract_pptx (line 199) | def extract_pptx(self) -> bool: method _extract_presentation_metadata (line 327) | def _extract_presentation_metadata(self, prs) -> dict: method _extract_slide (line 357) | def _extract_slide(self, slide, slide_number: int) -> dict: method _extract_group_shapes (line 446) | def _extract_group_shapes(self, group_shape) -> tuple[list[str], list[... method _process_text_frame (line 492) | def _process_text_frame(self, text_frame) -> tuple[str, list[dict]]: method _finalize_code_block (line 539) | def _finalize_code_block(self, code_parts: list[str]) -> dict: method _extract_tables (line 556) | def _extract_tables(self, table) -> dict | None: method _extract_images_info (line 590) | def _extract_images_info(self, slide) -> list[dict]: method _detect_code_blocks (line 637) | def _detect_code_blocks(self, paragraph) -> bool: method _text_looks_like_code (line 692) | def _text_looks_like_code(self, text: str) -> bool: method _extract_speaker_notes (line 735) | def _extract_speaker_notes(self, slide) -> str: method _is_image_shape (line 761) | def _is_image_shape(self, shape) -> bool: method _group_slides_into_sections (line 789) | def _group_slides_into_sections(self, slides: list[dict]) -> list[dict]: method _build_section_from_slides (line 869) | def _build_section_from_slides( method _detect_languages (line 958) | def _detect_languages( method load_extracted_data (line 1007) | def load_extracted_data(self, json_path: str) -> bool: method categorize_content (line 1023) | def categorize_content(self) -> dict[str, dict]: method build_skill (line 1104) | def build_skill(self) -> None: method _generate_reference_file (line 1145) | def _generate_reference_file( method _generate_index (line 1249) | def _generate_index(self, categorized: dict[str, dict]) -> None: method _generate_skill_md (line 1308) | def _generate_skill_md(self, categorized: dict[str, dict]) -> None: method _format_key_concepts (line 1477) | def _format_key_concepts(self) -> str: method _format_patterns_from_content (line 1529) | def _format_patterns_from_content(self) -> str: method _sanitize_filename (line 1595) | def _sanitize_filename(self, name: str) -> str: function _score_code_quality (line 1617) | def _score_code_quality(code: str) -> float: function main (line 1671) | def main() -> int: FILE: src/skill_seekers/cli/presets/analyze_presets.py class AnalysisPreset (line 20) | class AnalysisPreset: function apply_analyze_preset (line 88) | def apply_analyze_preset(args: argparse.Namespace, preset_name: str) -> ... function get_preset_help_text (line 119) | def get_preset_help_text(preset_name: str) -> str: function show_preset_list (line 136) | def show_preset_list() -> None: function resolve_enhance_level (line 169) | def resolve_enhance_level(args: argparse.Namespace) -> int: function apply_preset_with_warnings (line 195) | def apply_preset_with_warnings(args: argparse.Namespace) -> str: function print_deprecation_warning (line 250) | def print_deprecation_warning(old_flag: str, new_flag: str) -> None: FILE: src/skill_seekers/cli/presets/github_presets.py class GitHubPreset (line 17) | class GitHubPreset: function apply_github_preset (line 73) | def apply_github_preset(args: argparse.Namespace, preset_name: str) -> N... function show_github_preset_list (line 96) | def show_github_preset_list() -> None: FILE: src/skill_seekers/cli/presets/manager.py class AnalysisPreset (line 11) | class AnalysisPreset: class PresetManager (line 83) | class PresetManager: method get_preset (line 87) | def get_preset(name: str) -> AnalysisPreset | None: method list_presets (line 99) | def list_presets() -> list[str]: method format_preset_help (line 108) | def format_preset_help() -> str: method apply_preset (line 124) | def apply_preset(preset_name: str, args: dict) -> dict: method get_default_preset (line 162) | def get_default_preset() -> str: FILE: src/skill_seekers/cli/presets/scrape_presets.py class ScrapePreset (line 17) | class ScrapePreset: function apply_scrape_preset (line 80) | def apply_scrape_preset(args: argparse.Namespace, preset_name: str) -> N... function show_scrape_preset_list (line 111) | def show_scrape_preset_list() -> None: FILE: src/skill_seekers/cli/quality_checker.py class QualityIssue (line 18) | class QualityIssue: class QualityReport (line 29) | class QualityReport: method add_error (line 38) | def add_error(self, category: str, message: str, file: str = None, lin... method add_warning (line 42) | def add_warning(self, category: str, message: str, file: str = None, l... method add_info (line 46) | def add_info(self, category: str, message: str, file: str = None, line... method has_errors (line 51) | def has_errors(self) -> bool: method has_warnings (line 56) | def has_warnings(self) -> bool: method is_excellent (line 61) | def is_excellent(self) -> bool: method quality_score (line 66) | def quality_score(self) -> float: method quality_grade (line 79) | def quality_grade(self) -> str: class SkillQualityChecker (line 94) | class SkillQualityChecker: method __init__ (line 97) | def __init__(self, skill_dir: Path): method check_all (line 108) | def check_all(self) -> QualityReport: method _check_skill_structure (line 131) | def _check_skill_structure(self): method _check_enhancement_quality (line 152) | def _check_enhancement_quality(self): method _check_content_quality (line 209) | def _check_content_quality(self): method _check_links (line 286) | def _check_links(self): method _check_skill_completeness (line 324) | def _check_skill_completeness(self): function print_report (line 405) | def print_report(report: QualityReport, verbose: bool = False): function main (line 468) | def main(): FILE: src/skill_seekers/cli/quality_metrics.py class MetricLevel (line 17) | class MetricLevel(Enum): class QualityMetric (line 27) | class QualityMetric: class QualityScore (line 38) | class QualityScore: class QualityReport (line 50) | class QualityReport: class QualityAnalyzer (line 62) | class QualityAnalyzer: method __init__ (line 84) | def __init__(self, skill_dir: Path): method analyze_completeness (line 90) | def analyze_completeness(self) -> float: method analyze_accuracy (line 160) | def analyze_accuracy(self) -> float: method analyze_coverage (line 223) | def analyze_coverage(self) -> float: method analyze_health (line 288) | def analyze_health(self) -> float: method calculate_statistics (line 340) | def calculate_statistics(self) -> dict[str, Any]: method calculate_overall_score (line 374) | def calculate_overall_score( method generate_recommendations (line 404) | def generate_recommendations(self, score: QualityScore) -> list[str]: method generate_report (line 430) | def generate_report(self) -> QualityReport: method format_report (line 461) | def format_report(self, report: QualityReport) -> str: function main (line 526) | def main(): FILE: src/skill_seekers/cli/rag_chunker.py class RAGChunker (line 27) | class RAGChunker: method __init__ (line 38) | def __init__( method estimate_tokens (line 65) | def estimate_tokens(self, text: str) -> int: method chunk_document (line 79) | def chunk_document( method chunk_skill (line 142) | def chunk_skill(self, skill_dir: Path) -> list[dict]: method _extract_code_blocks (line 187) | def _extract_code_blocks(self, text: str) -> tuple[str, list[dict]]: method _reinsert_code_blocks (line 220) | def _reinsert_code_blocks(self, chunks: list[str], code_blocks: list[d... method _find_semantic_boundaries (line 242) | def _find_semantic_boundaries(self, text: str) -> list[int]: method _split_with_overlap (line 290) | def _split_with_overlap(self, text: str, boundaries: list[int]) -> lis... method save_chunks (line 363) | def save_chunks(self, chunks: list[dict], output_path: Path) -> None: function main (line 379) | def main(): FILE: src/skill_seekers/cli/rate_limit_handler.py class RateLimitError (line 22) | class RateLimitError(Exception): class RateLimitHandler (line 28) | class RateLimitHandler: method __init__ (line 47) | def __init__( method check_upfront (line 81) | def check_upfront(self) -> bool: method check_response (line 135) | def check_response(self, response: requests.Response) -> bool: method extract_rate_limit_info (line 164) | def extract_rate_limit_info(self, response: requests.Response) -> dict... method get_rate_limit_info (line 189) | def get_rate_limit_info(self) -> dict[str, Any]: method handle_rate_limit (line 217) | def handle_rate_limit(self, rate_info: dict[str, Any]) -> bool: method try_switch_profile (line 275) | def try_switch_profile(self) -> bool: method wait_for_reset (line 317) | def wait_for_reset(self, wait_seconds: float, wait_minutes: int) -> bool: method show_countdown_timer (line 353) | def show_countdown_timer(self, total_seconds: float): method prompt_user_action (line 375) | def prompt_user_action(self, wait_seconds: float, wait_minutes: int) -... function create_github_headers (line 425) | def create_github_headers(token: str | None = None) -> dict[str, str]: FILE: src/skill_seekers/cli/resume_command.py function list_resumable_jobs (line 13) | def list_resumable_jobs(): function resume_job (line 56) | def resume_job(job_id: str): function clean_old_jobs (line 110) | def clean_old_jobs(): function main (line 133) | def main(): FILE: src/skill_seekers/cli/rss_scraper.py function _check_feedparser_deps (line 70) | def _check_feedparser_deps() -> None: function infer_description_from_feed (line 80) | def infer_description_from_feed( class RssToSkillConverter (line 112) | class RssToSkillConverter: method __init__ (line 120) | def __init__(self, config: dict[str, Any]) -> None: method extract_feed (line 149) | def extract_feed(self) -> bool: method load_extracted_data (line 230) | def load_extracted_data(self, json_path: str) -> bool: method categorize_content (line 245) | def categorize_content(self) -> dict[str, dict[str, Any]]: method build_skill (line 288) | def build_skill(self) -> None: method _parse_feed (line 321) | def _parse_feed(self) -> "feedparser.FeedParserDict": method _detect_feed_type (line 348) | def _detect_feed_type(self, parsed: "feedparser.FeedParserDict") -> str: method _extract_feed_metadata (line 371) | def _extract_feed_metadata(self, parsed: "feedparser.FeedParserDict") ... method _extract_articles (line 401) | def _extract_articles(self, parsed: "feedparser.FeedParserDict") -> li... method _scrape_article_content (line 466) | def _scrape_article_content(self, url: str) -> str: method _extract_article_text (line 496) | def _extract_article_text(self, html: str) -> str: method _collect_all_categories (line 569) | def _collect_all_categories(self, articles: list[dict[str, Any]]) -> s... method _html_to_text (line 578) | def _html_to_text(self, html_fragment: str) -> str: method _generate_reference_file (line 592) | def _generate_reference_file(self, cat_key: str, cat_data: dict[str, A... method _generate_index (line 640) | def _generate_index(self, categorized: dict[str, dict[str, Any]]) -> N... method _generate_skill_md (line 688) | def _generate_skill_md(self, categorized: dict[str, dict[str, Any]]) -... method _count_authors (line 838) | def _count_authors(self) -> dict[str, int]: method _get_date_range (line 849) | def _get_date_range(self) -> tuple[str, str] | None: method _sanitize_filename (line 863) | def _sanitize_filename(self, name: str) -> str: function main (line 875) | def main() -> int: FILE: src/skill_seekers/cli/run_tests.py class ColoredTextTestResult (line 11) | class ColoredTextTestResult(unittest.TextTestResult): method __init__ (line 22) | def __init__(self, *args, **kwargs): method addSuccess (line 26) | def addSuccess(self, test): method addError (line 35) | def addError(self, test, err): method addFailure (line 44) | def addFailure(self, test, err): method addSkip (line 53) | def addSkip(self, test, reason): class ColoredTextTestRunner (line 63) | class ColoredTextTestRunner(unittest.TextTestRunner): function discover_tests (line 69) | def discover_tests(test_dir="tests"): function run_specific_suite (line 79) | def run_specific_suite(suite_name): function print_summary (line 103) | def print_summary(result): function main (line 164) | def main(): FILE: src/skill_seekers/cli/setup_wizard.py function show_installation_guide (line 10) | def show_installation_guide(): function check_first_run (line 70) | def check_first_run(): function main (line 87) | def main(): FILE: src/skill_seekers/cli/signal_flow_analyzer.py class SignalFlowAnalyzer (line 14) | class SignalFlowAnalyzer: method __init__ (line 17) | def __init__(self, analysis_results: dict[str, Any]): method analyze (line 30) | def analyze(self) -> dict[str, Any]: method _extract_signals (line 52) | def _extract_signals(self): method _extract_connections (line 70) | def _extract_connections(self): method _extract_emissions (line 88) | def _extract_emissions(self): method _build_flow_chains (line 106) | def _build_flow_chains(self): method _detect_patterns (line 124) | def _detect_patterns(self): method _calculate_statistics (line 168) | def _calculate_statistics(self) -> dict[str, Any]: method generate_signal_flow_diagram (line 202) | def generate_signal_flow_diagram(self) -> str: method extract_signal_usage_patterns (line 229) | def extract_signal_usage_patterns(self) -> list[dict[str, Any]]: method generate_how_to_guides (line 265) | def generate_how_to_guides(self, output_dir: Path, ai_mode: str = "LOC... method _generate_signal_guide (line 306) | def _generate_signal_guide(self, pattern: dict[str, Any], ai_mode: str... method save_analysis (line 396) | def save_analysis(self, output_dir: Path, ai_mode: str = "LOCAL"): method _generate_signal_reference (line 436) | def _generate_signal_reference(self, output_dir: Path, analysis: dict): FILE: src/skill_seekers/cli/source_detector.py class SourceInfo (line 23) | class SourceInfo: class SourceDetector (line 39) | class SourceDetector: method detect (line 49) | def detect(cls, source: str) -> SourceInfo: method _detect_config (line 162) | def _detect_config(cls, source: str) -> SourceInfo: method _detect_pdf (line 170) | def _detect_pdf(cls, source: str) -> SourceInfo: method _detect_word (line 178) | def _detect_word(cls, source: str) -> SourceInfo: method _detect_epub (line 186) | def _detect_epub(cls, source: str) -> SourceInfo: method _detect_jupyter (line 194) | def _detect_jupyter(cls, source: str) -> SourceInfo: method _detect_html (line 202) | def _detect_html(cls, source: str) -> SourceInfo: method _detect_pptx (line 210) | def _detect_pptx(cls, source: str) -> SourceInfo: method _detect_asciidoc (line 218) | def _detect_asciidoc(cls, source: str) -> SourceInfo: method _detect_manpage (line 226) | def _detect_manpage(cls, source: str) -> SourceInfo: method _detect_rss (line 234) | def _detect_rss(cls, source: str) -> SourceInfo: method _looks_like_openapi (line 242) | def _looks_like_openapi(cls, source: str) -> bool: method _detect_openapi (line 270) | def _detect_openapi(cls, source: str) -> SourceInfo: method _detect_video_file (line 278) | def _detect_video_file(cls, source: str) -> SourceInfo: method _detect_video_url (line 289) | def _detect_video_url(cls, source: str) -> SourceInfo | None: method _detect_local (line 334) | def _detect_local(cls, source: str) -> SourceInfo: method _detect_github (line 345) | def _detect_github(cls, source: str) -> SourceInfo | None: method _detect_web (line 381) | def _detect_web(cls, source: str) -> SourceInfo: method validate_source (line 396) | def validate_source(cls, source_info: SourceInfo) -> None: FILE: src/skill_seekers/cli/split_config.py class ConfigSplitter (line 17) | class ConfigSplitter: method __init__ (line 20) | def __init__(self, config_path: str, strategy: str = "auto", target_pa... method load_config (line 27) | def load_config(self) -> dict[str, Any]: method is_unified_config (line 39) | def is_unified_config(self) -> bool: method get_split_strategy (line 43) | def get_split_strategy(self) -> str: method split_by_category (line 92) | def split_by_category(self, create_router: bool = False) -> list[dict[... method split_by_size (line 153) | def split_by_size(self) -> list[dict[str, Any]]: method split_by_source (line 180) | def split_by_source(self) -> list[dict[str, Any]]: method create_router_config (line 220) | def create_router_config(self, sub_configs: list[dict[str, Any]]) -> d... method split (line 241) | def split(self) -> list[dict[str, Any]]: method save_configs (line 275) | def save_configs(self, configs: list[dict[str, Any]], output_dir: Path... function main (line 298) | def main(): FILE: src/skill_seekers/cli/storage/__init__.py function get_storage_adaptor (line 31) | def get_storage_adaptor(provider: str, **kwargs) -> BaseStorageAdaptor: FILE: src/skill_seekers/cli/storage/azure_storage.py class AzureStorageAdaptor (line 20) | class AzureStorageAdaptor(BaseStorageAdaptor): method __init__ (line 53) | def __init__(self, **kwargs): method upload_file (line 109) | def upload_file( method download_file (line 127) | def download_file(self, remote_path: str, local_path: str) -> None: method delete_file (line 143) | def delete_file(self, remote_path: str) -> None: method list_files (line 153) | def list_files(self, prefix: str = "", max_results: int = 1000) -> lis... method file_exists (line 178) | def file_exists(self, remote_path: str) -> bool: method get_file_url (line 186) | def get_file_url(self, remote_path: str, expires_in: int = 3600) -> str: method copy_file (line 212) | def copy_file(self, source_path: str, dest_path: str) -> None: FILE: src/skill_seekers/cli/storage/base_storage.py class StorageObject (line 11) | class StorageObject: class BaseStorageAdaptor (line 30) | class BaseStorageAdaptor(ABC): method __init__ (line 38) | def __init__(self, **kwargs): method upload_file (line 48) | def upload_file( method download_file (line 69) | def download_file(self, remote_path: str, local_path: str) -> None: method delete_file (line 84) | def delete_file(self, remote_path: str) -> None: method list_files (line 98) | def list_files(self, prefix: str = "", max_results: int = 1000) -> lis... method file_exists (line 115) | def file_exists(self, remote_path: str) -> bool: method get_file_url (line 128) | def get_file_url(self, remote_path: str, expires_in: int = 3600) -> str: method upload_directory (line 145) | def upload_directory( method download_directory (line 192) | def download_directory(self, remote_prefix: str, local_dir: str) -> li... method get_file_size (line 226) | def get_file_size(self, remote_path: str) -> int: method copy_file (line 244) | def copy_file(self, source_path: str, dest_path: str) -> None: FILE: src/skill_seekers/cli/storage/gcs_storage.py class GCSStorageAdaptor (line 20) | class GCSStorageAdaptor(BaseStorageAdaptor): method __init__ (line 51) | def __init__(self, **kwargs): method upload_file (line 84) | def upload_file( method download_file (line 103) | def download_file(self, remote_path: str, local_path: str) -> None: method delete_file (line 116) | def delete_file(self, remote_path: str) -> None: method list_files (line 126) | def list_files(self, prefix: str = "", max_results: int = 1000) -> lis... method file_exists (line 149) | def file_exists(self, remote_path: str) -> bool: method get_file_url (line 157) | def get_file_url(self, remote_path: str, expires_in: int = 3600) -> str: method copy_file (line 174) | def copy_file(self, source_path: str, dest_path: str) -> None: FILE: src/skill_seekers/cli/storage/s3_storage.py class S3StorageAdaptor (line 19) | class S3StorageAdaptor(BaseStorageAdaptor): method __init__ (line 56) | def __init__(self, **kwargs): method upload_file (line 92) | def upload_file( method download_file (line 115) | def download_file(self, remote_path: str, local_path: str) -> None: method delete_file (line 127) | def delete_file(self, remote_path: str) -> None: method list_files (line 134) | def list_files(self, prefix: str = "", max_results: int = 1000) -> lis... method file_exists (line 161) | def file_exists(self, remote_path: str) -> bool: method get_file_url (line 171) | def get_file_url(self, remote_path: str, expires_in: int = 3600) -> str: method copy_file (line 183) | def copy_file(self, source_path: str, dest_path: str) -> None: FILE: src/skill_seekers/cli/streaming_ingest.py class ChunkMetadata (line 18) | class ChunkMetadata: class IngestionProgress (line 32) | class IngestionProgress: method progress_percent (line 44) | def progress_percent(self) -> float: method elapsed_time (line 51) | def elapsed_time(self) -> float: method chunks_per_second (line 56) | def chunks_per_second(self) -> float: method eta_seconds (line 64) | def eta_seconds(self) -> float: class StreamingIngester (line 73) | class StreamingIngester: method __init__ (line 81) | def __init__( method chunk_document (line 103) | def chunk_document( method _generate_chunk_id (line 172) | def _generate_chunk_id(self, content: str, metadata: dict, chunk_index... method stream_skill_directory (line 179) | def stream_skill_directory( method batch_iterator (line 273) | def batch_iterator( method save_checkpoint (line 300) | def save_checkpoint(self, checkpoint_path: Path, state: dict) -> None: method load_checkpoint (line 326) | def load_checkpoint(self, checkpoint_path: Path) -> dict | None: method format_progress (line 348) | def format_progress(self) -> str: function main (line 377) | def main(): FILE: src/skill_seekers/cli/swift_patterns.py function _validate_patterns (line 523) | def _validate_patterns(patterns: dict[str, list[tuple[str, int]]]) -> None: FILE: src/skill_seekers/cli/sync_cli.py function handle_signal (line 16) | def handle_signal(_signum, _frame): function start_command (line 22) | def start_command(args): function check_command (line 51) | def check_command(args): function stats_command (line 95) | def stats_command(args): function reset_command (line 111) | def reset_command(args): function main (line 125) | def main(): FILE: src/skill_seekers/cli/sync_config.py function _is_valid_url (line 33) | def _is_valid_url( function discover_urls (line 52) | def discover_urls( function diff_urls (line 135) | def diff_urls(discovered: set[str], configured: list[str]) -> tuple[list... function _get_doc_source (line 152) | def _get_doc_source(config: dict, source_index: int = 0) -> dict | None: function _set_start_urls (line 171) | def _set_start_urls(config: dict, source_index: int, urls: list[str]) ->... function sync_config (line 188) | def sync_config( function main (line 298) | def main() -> None: FILE: src/skill_seekers/cli/test_example_extractor.py class TestExample (line 51) | class TestExample: method to_dict (line 82) | def to_dict(self) -> dict: method to_markdown (line 86) | def to_markdown(self) -> str: class ExampleReport (line 116) | class ExampleReport: method to_dict (line 128) | def to_dict(self) -> dict: method to_markdown (line 141) | def to_markdown(self) -> str: class PythonTestAnalyzer (line 168) | class PythonTestAnalyzer: method __init__ (line 171) | def __init__(self): method extract (line 180) | def extract(self, file_path: str, code: str) -> list[TestExample]: method _extract_imports (line 205) | def _extract_imports(self, tree: ast.AST) -> list[str]: method _is_test_class (line 215) | def _is_test_class(self, node: ast.ClassDef) -> bool: method _is_test_function (line 228) | def _is_test_function(self, node: ast.FunctionDef) -> bool: method _extract_from_test_class (line 239) | def _extract_from_test_class( method _extract_from_test_function (line 257) | def _extract_from_test_function( method _extract_setup_method (line 266) | def _extract_setup_method(self, class_node: ast.ClassDef) -> str | None: method _extract_fixtures (line 273) | def _extract_fixtures(self, func_node: ast.FunctionDef) -> str | None: method _analyze_test_body (line 284) | def _analyze_test_body( method _detect_tags (line 326) | def _detect_tags(self, func_node: ast.FunctionDef, imports: list[str])... method _find_instantiations (line 351) | def _find_instantiations( method _find_method_calls_with_assertions (line 400) | def _find_method_calls_with_assertions( method _find_config_dicts (line 452) | def _find_config_dicts( method _find_workflows (line 496) | def _find_workflows( method _is_meaningful_instantiation (line 540) | def _is_meaningful_instantiation(self, node: ast.Assign) -> bool: method _get_class_name (line 549) | def _get_class_name(self, call_node: ast.Call) -> str: method _is_assertion (line 557) | def _is_assertion(self, node: ast.stmt) -> bool: method _is_config_dict (line 569) | def _is_config_dict(self, dict_node: ast.Dict) -> bool: method _is_integration_test (line 577) | def _is_integration_test(self, func_node: ast.FunctionDef) -> bool: method _extract_assertion_after (line 611) | def _extract_assertion_after(self, func_node: ast.FunctionDef, target_... method _extract_final_assertion (line 622) | def _extract_final_assertion(self, func_node: ast.FunctionDef) -> str: method _calculate_complexity (line 629) | def _calculate_complexity(self, code: str) -> float: method _generate_id (line 638) | def _generate_id(self, code: str) -> str: class GenericTestAnalyzer (line 648) | class GenericTestAnalyzer: method extract (line 733) | def extract(self, file_path: str, code: str, language: str) -> list[Te... method _create_example (line 838) | def _create_example( class ExampleQualityFilter (line 871) | class ExampleQualityFilter: method __init__ (line 874) | def __init__(self, min_confidence: float = 0.7, min_code_length: int =... method filter (line 889) | def filter(self, examples: list[TestExample]) -> list[TestExample]: method _is_trivial (line 910) | def _is_trivial(self, code: str) -> bool: class TestExampleExtractor (line 920) | class TestExampleExtractor: method __init__ (line 953) | def __init__( method extract_from_directory (line 978) | def extract_from_directory(self, directory: Path, recursive: bool = Tr... method extract_from_file (line 999) | def extract_from_file(self, file_path: Path) -> list[TestExample]: method _find_test_files (line 1040) | def _find_test_files(self, directory: Path, recursive: bool) -> list[P... method _detect_language (line 1052) | def _detect_language(self, file_path: Path) -> str: method _create_report (line 1057) | def _create_report( function main (line 1112) | def main(): FILE: src/skill_seekers/cli/test_unified_simple.py function test_validate_existing_unified_configs (line 20) | def test_validate_existing_unified_configs(): function test_backward_compatibility (line 42) | def test_backward_compatibility(): function test_create_temp_unified_config (line 57) | def test_create_temp_unified_config(): function test_mixed_source_types (line 95) | def test_mixed_source_types(): function test_config_validation_errors (line 128) | def test_config_validation_errors(): FILE: src/skill_seekers/cli/unified_codebase_analyzer.py class AnalysisResult (line 23) | class AnalysisResult: class UnifiedCodebaseAnalyzer (line 33) | class UnifiedCodebaseAnalyzer: method __init__ (line 62) | def __init__(self, github_token: str | None = None): method analyze (line 71) | def analyze( method _analyze_github (line 105) | def _analyze_github( method _analyze_local (line 160) | def _analyze_local(self, directory: str, depth: str) -> AnalysisResult: method basic_analysis (line 191) | def basic_analysis(self, directory: Path) -> dict: method c3x_analysis (line 222) | def c3x_analysis(self, directory: Path) -> dict: method _load_c3x_results (line 308) | def _load_c3x_results(self, output_dir: Path) -> dict: method is_github_url (line 385) | def is_github_url(self, source: str) -> bool: method list_files (line 397) | def list_files(self, directory: Path) -> list[dict]: method get_directory_structure (line 423) | def get_directory_structure(self, directory: Path) -> dict: method extract_imports (line 452) | def extract_imports(self, directory: Path) -> dict[str, list[str]]: method find_entry_points (line 486) | def find_entry_points(self, directory: Path) -> list[str]: method compute_statistics (line 526) | def compute_statistics(self, directory: Path) -> dict: FILE: src/skill_seekers/cli/unified_enhancer.py class EnhancementConfig (line 42) | class EnhancementConfig: class UnifiedEnhancer (line 52) | class UnifiedEnhancer: method __init__ (line 65) | def __init__( method _check_claude_cli (line 131) | def _check_claude_cli(self) -> bool: method enhance (line 144) | def enhance( method _enhance_parallel (line 195) | def _enhance_parallel(self, batches: list[list[dict]], prompt_template... method _enhance_batch (line 227) | def _enhance_batch(self, items: list[dict], prompt_template: str) -> l... method _call_claude (line 267) | def _call_claude(self, prompt: str, max_tokens: int = 1000) -> str | N... method _call_claude_api (line 275) | def _call_claude_api(self, prompt: str, max_tokens: int = 1000) -> str... method _call_claude_local (line 291) | def _call_claude_local(self, prompt: str) -> str | None: method _get_default_prompt (line 351) | def _get_default_prompt(self, enhancement_type: str) -> str: method _format_item_for_prompt (line 404) | def _format_item_for_prompt(self, idx: int, item: dict) -> str: class PatternEnhancer (line 421) | class PatternEnhancer(UnifiedEnhancer): method enhance_patterns (line 424) | def enhance_patterns(self, patterns: list[dict]) -> list[dict]: class TestExampleEnhancer (line 428) | class TestExampleEnhancer(UnifiedEnhancer): method enhance_examples (line 431) | def enhance_examples(self, examples: list[dict]) -> list[dict]: class GuideEnhancer (line 435) | class GuideEnhancer(UnifiedEnhancer): method enhance_guides (line 438) | def enhance_guides(self, guides: list[dict]) -> list[dict]: class ConfigEnhancer (line 442) | class ConfigEnhancer(UnifiedEnhancer): method enhance_config (line 445) | def enhance_config(self, config: list[dict]) -> list[dict]: FILE: src/skill_seekers/cli/unified_scraper.py class UnifiedScraper (line 40) | class UnifiedScraper: method __init__ (line 52) | def __init__(self, config_path: str, merge_mode: str | None = None): method _setup_logging (line 134) | def _setup_logging(self): method scrape_all_sources (line 158) | def scrape_all_sources(self): method _scrape_documentation (line 221) | def _scrape_documentation(self, source: dict[str, Any]): method _clone_github_repo (line 318) | def _clone_github_repo(self, repo_name: str, idx: int = 0) -> str | None: method _scrape_github (line 378) | def _scrape_github(self, source: dict[str, Any]): method _scrape_pdf (line 512) | def _scrape_pdf(self, source: dict[str, Any]): method _scrape_word (line 574) | def _scrape_word(self, source: dict[str, Any]): method _scrape_video (line 634) | def _scrape_video(self, source: dict[str, Any]): method _scrape_local (line 694) | def _scrape_local(self, source: dict[str, Any]): method _scrape_epub (line 840) | def _scrape_epub(self, source: dict[str, Any]): method _scrape_jupyter (line 892) | def _scrape_jupyter(self, source: dict[str, Any]): method _scrape_html (line 944) | def _scrape_html(self, source: dict[str, Any]): method _scrape_openapi (line 993) | def _scrape_openapi(self, source: dict[str, Any]): method _scrape_asciidoc (line 1043) | def _scrape_asciidoc(self, source: dict[str, Any]): method _scrape_pptx (line 1095) | def _scrape_pptx(self, source: dict[str, Any]): method _scrape_confluence (line 1147) | def _scrape_confluence(self, source: dict[str, Any]): method _scrape_notion (line 1204) | def _scrape_notion(self, source: dict[str, Any]): method _scrape_rss (line 1262) | def _scrape_rss(self, source: dict[str, Any]): method _scrape_manpage (line 1317) | def _scrape_manpage(self, source: dict[str, Any]): method _scrape_chat (line 1368) | def _scrape_chat(self, source: dict[str, Any]): method _load_json (line 1425) | def _load_json(self, file_path: Path) -> dict: method _load_guide_collection (line 1446) | def _load_guide_collection(self, tutorials_dir: Path) -> dict: method _load_api_reference (line 1473) | def _load_api_reference(self, api_dir: Path) -> dict[str, Any]: method _run_c3_analysis (line 1497) | def _run_c3_analysis(self, local_repo_path: str, source: dict[str, Any... method detect_conflicts (line 1592) | def detect_conflicts(self) -> list: method merge_sources (line 1648) | def merge_sources(self, conflicts: list): method build_skill (line 1692) | def build_skill(self, merged_data: dict | None = None): method run (line 1720) | def run(self, args=None): function main (line 1815) | def main(): FILE: src/skill_seekers/cli/unified_skill_builder.py class UnifiedSkillBuilder (line 25) | class UnifiedSkillBuilder: method __init__ (line 30) | def __init__( method build (line 64) | def build(self): method _load_source_skill_mds (line 80) | def _load_source_skill_mds(self) -> dict[str, str]: method _parse_skill_md_sections (line 180) | def _parse_skill_md_sections(self, skill_md: str) -> dict[str, str]: method _synthesize_docs_github (line 237) | def _synthesize_docs_github(self, skill_mds: dict[str, str]) -> str: method _synthesize_docs_github_pdf (line 396) | def _synthesize_docs_github_pdf(self, skill_mds: dict[str, str]) -> str: method _generate_skill_md (line 469) | def _generate_skill_md(self): method _synthesize_docs_pdf (line 541) | def _synthesize_docs_pdf(self, skill_mds: dict[str, str]) -> str: method _synthesize_github_pdf (line 587) | def _synthesize_github_pdf(self, skill_mds: dict[str, str]) -> str: method _generic_merge (line 652) | def _generic_merge(self, skill_mds: dict[str, str]) -> str: method _append_extra_sources (line 737) | def _append_extra_sources( method _generate_minimal_skill_md (line 786) | def _generate_minimal_skill_md(self) -> str: method _format_merged_apis (line 907) | def _format_merged_apis(self) -> str: method _format_api_entry (line 958) | def _format_api_entry(self, api_data: dict, inline_conflict: bool = Fa... method _format_code_signature (line 994) | def _format_code_signature(self, code_info: dict) -> str: method _generate_references (line 1015) | def _generate_references(self): method _generate_docs_references (line 1065) | def _generate_docs_references(self, docs_list: list[dict]): method _generate_github_references (line 1131) | def _generate_github_references(self, github_list: list[dict]): method _generate_pdf_references (line 1217) | def _generate_pdf_references(self, pdf_list: list[dict]): method _generate_generic_references (line 1234) | def _generate_generic_references(self, source_type: str, source_list: ... method _generate_merged_api_reference (line 1291) | def _generate_merged_api_reference(self): method _generate_c3_analysis_references (line 1311) | def _generate_c3_analysis_references(self, repo_id: str = "github"): method _generate_architecture_overview (line 1353) | def _generate_architecture_overview(self, c3_dir: str, c3_data: dict, ... method _generate_pattern_references (line 1537) | def _generate_pattern_references(self, c3_dir: str, patterns_data: dict): method _generate_example_references (line 1572) | def _generate_example_references(self, c3_dir: str, examples_data: dict): method _generate_guide_references (line 1617) | def _generate_guide_references(self, c3_dir: str, guides_data: dict): method _generate_config_references (line 1672) | def _generate_config_references(self, c3_dir: str, config_data: dict): method _copy_architecture_details (line 1730) | def _copy_architecture_details(self, c3_dir: str, arch_data: dict): method _format_c3_summary_section (line 1765) | def _format_c3_summary_section(self, c3_data: dict) -> str: method _generate_conflicts_report (line 1834) | def _generate_conflicts_report(self): FILE: src/skill_seekers/cli/upload_skill.py function upload_skill_api (line 33) | def upload_skill_api(package_path, target="claude", api_key=None, **kwar... function main (line 114) | def main(): FILE: src/skill_seekers/cli/utils.py function setup_logging (line 21) | def setup_logging(verbose: bool = False, quiet: bool = False) -> None: function open_folder (line 37) | def open_folder(folder_path: str | Path) -> bool: function has_api_key (line 77) | def has_api_key() -> bool: function get_api_key (line 88) | def get_api_key() -> str | None: function get_upload_url (line 99) | def get_upload_url() -> str: function print_upload_instructions (line 109) | def print_upload_instructions(zip_path: str | Path) -> None: function format_file_size (line 132) | def format_file_size(size_bytes: int) -> str: function validate_skill_directory (line 150) | def validate_skill_directory(skill_dir: str | Path) -> tuple[bool, str |... function validate_zip_file (line 175) | def validate_zip_file(zip_path: str | Path) -> tuple[bool, str | None]: function read_reference_files (line 199) | def read_reference_files( function retry_with_backoff (line 344) | def retry_with_backoff( function retry_with_backoff_async (line 401) | async def retry_with_backoff_async( function build_line_index (line 461) | def build_line_index(content: str) -> list[int]: function offset_to_line (line 473) | def offset_to_line(newline_offsets: list[int], offset: int) -> int: function sanitize_url (line 494) | def sanitize_url(url: str) -> str: FILE: src/skill_seekers/cli/video_metadata.py function extract_video_id (line 56) | def extract_video_id(url: str) -> str | None: function detect_video_source_type (line 72) | def detect_video_source_type(url_or_path: str) -> VideoSourceType: function _check_ytdlp (line 100) | def _check_ytdlp(): function extract_youtube_metadata (line 110) | def extract_youtube_metadata(url: str) -> VideoInfo: function extract_local_metadata (line 172) | def extract_local_metadata(file_path: str) -> VideoInfo: function resolve_playlist (line 199) | def resolve_playlist(url: str) -> list[str]: function resolve_channel (line 235) | def resolve_channel(url: str, max_videos: int = 50) -> list[str]: FILE: src/skill_seekers/cli/video_models.py class VideoSourceType (line 23) | class VideoSourceType(Enum): class TranscriptSource (line 32) | class TranscriptSource(Enum): class FrameType (line 42) | class FrameType(Enum): class CodeContext (line 55) | class CodeContext(Enum): class SegmentContentType (line 65) | class SegmentContentType(Enum): class SegmentationStrategy (line 78) | class SegmentationStrategy(Enum): class Chapter (line 93) | class Chapter: method duration (line 101) | def duration(self) -> float: method to_dict (line 104) | def to_dict(self) -> dict: method from_dict (line 112) | def from_dict(cls, data: dict) -> Chapter: class WordTimestamp (line 121) | class WordTimestamp: method to_dict (line 129) | def to_dict(self) -> dict: method from_dict (line 138) | def from_dict(cls, data: dict) -> WordTimestamp: class TranscriptSegment (line 148) | class TranscriptSegment: method to_dict (line 158) | def to_dict(self) -> dict: method from_dict (line 169) | def from_dict(cls, data: dict) -> TranscriptSegment: class OCRRegion (line 184) | class OCRRegion: method to_dict (line 192) | def to_dict(self) -> dict: method from_dict (line 201) | def from_dict(cls, data: dict) -> OCRRegion: class FrameSubSection (line 211) | class FrameSubSection: method to_dict (line 227) | def to_dict(self) -> dict: method from_dict (line 238) | def from_dict(cls, data: dict) -> FrameSubSection: class KeyFrame (line 250) | class KeyFrame: method to_dict (line 264) | def to_dict(self) -> dict: method from_dict (line 279) | def from_dict(cls, data: dict) -> KeyFrame: class CodeBlock (line 295) | class CodeBlock: method to_dict (line 305) | def to_dict(self) -> dict: method from_dict (line 316) | def from_dict(cls, data: dict) -> CodeBlock: class TextGroupEdit (line 328) | class TextGroupEdit: method to_dict (line 336) | def to_dict(self) -> dict: method from_dict (line 345) | def from_dict(cls, data: dict) -> TextGroupEdit: class TextGroup (line 355) | class TextGroup: method full_text (line 371) | def full_text(self) -> str: method to_dict (line 374) | def to_dict(self) -> dict: method from_dict (line 387) | def from_dict(cls, data: dict) -> TextGroup: class TextGroupTimeline (line 400) | class TextGroupTimeline: method get_groups_at_time (line 408) | def get_groups_at_time(self, timestamp: float) -> list[TextGroup]: method to_dict (line 416) | def to_dict(self) -> dict: method from_dict (line 425) | def from_dict(cls, data: dict) -> TextGroupTimeline: class AudioVisualAlignment (line 435) | class AudioVisualAlignment: method to_dict (line 445) | def to_dict(self) -> dict: method from_dict (line 456) | def from_dict(cls, data: dict) -> AudioVisualAlignment: class VideoSegment (line 473) | class VideoSegment: method to_dict (line 507) | def to_dict(self) -> dict: method from_dict (line 532) | def from_dict(cls, data: dict) -> VideoSegment: method timestamp_display (line 559) | def timestamp_display(self) -> str: class VideoInfo (line 571) | class VideoInfo: method to_dict (line 633) | def to_dict(self) -> dict: method from_dict (line 675) | def from_dict(cls, data: dict) -> VideoInfo: class VideoSourceConfig (line 720) | class VideoSourceConfig: method from_dict (line 758) | def from_dict(cls, data: dict) -> VideoSourceConfig: method validate (line 780) | def validate(self) -> list[str]: class VideoScraperResult (line 815) | class VideoScraperResult: method to_dict (line 827) | def to_dict(self) -> dict: method from_dict (line 839) | def from_dict(cls, data: dict) -> VideoScraperResult: FILE: src/skill_seekers/cli/video_scraper.py function check_video_dependencies (line 58) | def check_video_dependencies(require_full: bool = False) -> None: function _sanitize_filename (line 102) | def _sanitize_filename(title: str, max_length: int = 60) -> str: function parse_time_to_seconds (line 112) | def parse_time_to_seconds(time_str: str) -> float: function _format_duration (line 151) | def _format_duration(seconds: float) -> str: function _format_count (line 161) | def _format_count(count: int | None) -> str: function infer_description_from_video (line 168) | def infer_description_from_video(video_info: VideoInfo, name: str = "") ... function _build_audio_visual_alignments (line 189) | def _build_audio_visual_alignments( function _is_likely_code (line 250) | def _is_likely_code(text: str) -> bool: function _ai_clean_reference (line 264) | def _ai_clean_reference(ref_path: str, content: str, api_key: str | None... class VideoToSkillConverter (line 321) | class VideoToSkillConverter: method __init__ (line 324) | def __init__(self, config: dict): method process (line 358) | def process(self) -> VideoScraperResult: method save_extracted_data (line 593) | def save_extracted_data(self) -> str: method load_extracted_data (line 609) | def load_extracted_data(self, json_path: str) -> None: method build_skill (line 620) | def build_skill(self) -> str: method _generate_reference_md (line 665) | def _generate_reference_md(self, video: VideoInfo) -> str: method _enhance_reference_files (line 864) | def _enhance_reference_files(self, enhance_level: int, args) -> None: method _generate_skill_md (line 902) | def _generate_skill_md(self) -> str: function main (line 1022) | def main() -> int: function _run_video_enhancement (line 1193) | def _run_video_enhancement(skill_dir: str, enhance_level: int, args) -> ... FILE: src/skill_seekers/cli/video_segmenter.py function _classify_content_type (line 21) | def _classify_content_type(transcript: str) -> SegmentContentType: function _build_segment_content (line 39) | def _build_segment_content( function _get_transcript_in_range (line 64) | def _get_transcript_in_range( function segment_by_chapters (line 88) | def segment_by_chapters( function segment_by_time_window (line 131) | def segment_by_time_window( function segment_video (line 196) | def segment_video( FILE: src/skill_seekers/cli/video_setup.py class GPUVendor (line 40) | class GPUVendor(Enum): class GPUInfo (line 49) | class GPUInfo: class SetupModules (line 60) | class SetupModules: function _cuda_version_to_index_url (line 78) | def _cuda_version_to_index_url(version: str) -> str: function _rocm_version_to_index_url (line 97) | def _rocm_version_to_index_url(version: str) -> str: function detect_gpu (line 119) | def detect_gpu() -> GPUInfo: function _check_nvidia (line 152) | def _check_nvidia() -> GPUInfo | None: function _check_amd_rocm (line 190) | def _check_amd_rocm() -> GPUInfo | None: function _read_rocm_version (line 227) | def _read_rocm_version() -> str: function _check_amd_lspci (line 236) | def _check_amd_lspci() -> GPUInfo | None: function is_in_venv (line 274) | def is_in_venv() -> bool: function create_venv (line 279) | def create_venv(venv_path: str = ".venv") -> bool: function get_venv_python (line 293) | def get_venv_python(venv_path: str = ".venv") -> str: function get_venv_activate_cmd (line 301) | def get_venv_activate_cmd(venv_path: str = ".venv") -> str: function _detect_distro (line 314) | def _detect_distro() -> str: function _get_tesseract_install_cmd (line 332) | def _get_tesseract_install_cmd() -> str: function check_tesseract (line 344) | def check_tesseract() -> dict[str, bool | str]: function configure_rocm_env (line 396) | def configure_rocm_env() -> list[str]: function _build_visual_deps (line 427) | def _build_visual_deps(modules: SetupModules) -> list[str]: function install_torch (line 444) | def install_torch(gpu_info: GPUInfo, python_exe: str | None = None) -> b... function install_visual_deps (line 466) | def install_visual_deps(modules: SetupModules | None = None, python_exe:... function install_skill_seekers (line 493) | def install_skill_seekers(python_exe: str) -> bool: function verify_installation (line 508) | def verify_installation() -> dict[str, bool]: function _ask_modules (line 590) | def _ask_modules(interactive: bool) -> SetupModules: function _interactive_yn (line 620) | def _interactive_yn(prompt: str, default: bool = True) -> bool: function run_setup (line 637) | def run_setup(interactive: bool = True) -> int: FILE: src/skill_seekers/cli/video_transcript.py function extract_youtube_transcript (line 45) | def extract_youtube_transcript( function _parse_timestamp_srt (line 134) | def _parse_timestamp_srt(ts: str) -> float: function _parse_timestamp_vtt (line 144) | def _parse_timestamp_vtt(ts: str) -> float: function parse_srt (line 157) | def parse_srt(path: str) -> list[TranscriptSegment]: function parse_vtt (line 213) | def parse_vtt(path: str) -> list[TranscriptSegment]: function transcribe_with_whisper (line 308) | def transcribe_with_whisper( function get_transcript (line 334) | def get_transcript( FILE: src/skill_seekers/cli/video_visual.py function _detect_gpu (line 95) | def _detect_gpu() -> bool: function _get_ocr_reader (line 107) | def _get_ocr_reader(): function _detect_theme (line 120) | def _detect_theme(gray_img) -> str: function _preprocess_frame_for_ocr (line 131) | def _preprocess_frame_for_ocr(frame_path: str, frame_type: FrameType) ->... function _binarize_for_tesseract (line 200) | def _binarize_for_tesseract(grayscale_path: str) -> str: function _get_ocr_params (line 234) | def _get_ocr_params(frame_type: FrameType) -> dict: function _has_code_tokens (line 315) | def _has_code_tokens(text: str) -> bool: function _run_tesseract_ocr (line 321) | def _run_tesseract_ocr(preprocessed_path: str, frame_type: FrameType) ->... function _run_multi_engine_ocr (line 411) | def _run_multi_engine_ocr( function _ensemble_ocr_results (line 435) | def _ensemble_ocr_results( function _merge_by_y_bucket (line 473) | def _merge_by_y_bucket( function _pick_better_ocr_result (line 529) | def _pick_better_ocr_result(result_a: tuple, result_b: tuple) -> tuple: function _ocr_with_claude_vision (line 550) | def _ocr_with_claude_vision(frame_path: str, frame_type: FrameType) -> t... function check_visual_dependencies (line 626) | def check_visual_dependencies() -> dict[str, bool]: function detect_scenes (line 639) | def detect_scenes(video_path: str) -> list[tuple[float, float]]: function extract_keyframes (line 670) | def extract_keyframes(video_path: str, timestamps: list[float]) -> list[... function _classify_region (line 729) | def _classify_region(gray, edges, hsv) -> FrameType: function _detect_panel_dividers (line 767) | def _detect_panel_dividers(gray) -> tuple[list[int], list[int]]: function classify_frame_regions (line 814) | def classify_frame_regions( function _find_code_bbox (line 879) | def _find_code_bbox( function _get_code_panels (line 903) | def _get_code_panels( function _crop_code_region (line 922) | def _crop_code_region(frame_path: str, bbox: tuple[int, int, int, int], ... function _frame_type_from_regions (line 940) | def _frame_type_from_regions( function classify_frame (line 959) | def classify_frame(frame_path: str) -> FrameType: function extract_text_from_frame (line 988) | def extract_text_from_frame( function _cluster_ocr_into_lines (line 1031) | def _cluster_ocr_into_lines( function _fuzzy_word_match (line 1133) | def _fuzzy_word_match(a: str, b: str) -> bool: function _fix_intra_line_duplication (line 1154) | def _fix_intra_line_duplication(line: str) -> str: function _clean_ocr_line (line 1198) | def _clean_ocr_line(line: str) -> str: function _assemble_structured_text (line 1216) | def _assemble_structured_text(regions: list[OCRRegion], frame_type: Fram... function _compute_frame_timestamps (line 1265) | def _compute_frame_timestamps( function _frames_are_similar (line 1327) | def _frames_are_similar(frame_a, frame_b, threshold: float = 3.0) -> bool: function _text_similarity (line 1361) | def _text_similarity(text_a: str, text_b: str) -> float: class YBucketLine (line 1377) | class YBucketLine: class YBucketConsensusEngine (line 1387) | class YBucketConsensusEngine: method __init__ (line 1395) | def __init__(self, y_tolerance: float = 15.0): method add_frame (line 1400) | def add_frame( method build_consensus (line 1436) | def build_consensus(self) -> list[YBucketLine]: method get_consensus_text (line 1487) | def get_consensus_text(self) -> str: method get_consensus_confidence (line 1491) | def get_consensus_confidence(self) -> float: method get_bucket_y_centers (line 1498) | def get_bucket_y_centers(self) -> set[float]: method reset (line 1502) | def reset(self) -> None: class TrackedTextBlock (line 1509) | class TrackedTextBlock: class TextBlockTracker (line 1527) | class TextBlockTracker: method __init__ (line 1534) | def __init__(self, similarity_threshold: float = 0.6, y_tolerance: flo... method update (line 1545) | def update( method _match_by_y_buckets (line 1628) | def _match_by_y_buckets( method _match_by_panel_position (line 1677) | def _match_by_panel_position( method _complete_all_active (line 1728) | def _complete_all_active(self) -> None: method _assign_text_group (line 1754) | def _assign_text_group(self, block: TrackedTextBlock) -> None: method _compute_edit (line 1834) | def _compute_edit( method finalize (line 1878) | def finalize(self) -> list[TrackedTextBlock]: method get_text_groups (line 1885) | def get_text_groups(self) -> list[TextGroup]: function _extract_code_blocks (line 1915) | def _extract_code_blocks( function _ocr_single_panel (line 1995) | def _ocr_single_panel( function extract_visual_data (line 2056) | def extract_visual_data( function download_video (line 2338) | def download_video( FILE: src/skill_seekers/cli/word_scraper.py function _check_word_deps (line 33) | def _check_word_deps(): function infer_description_from_word (line 43) | def infer_description_from_word(metadata: dict = None, name: str = "") -... class WordToSkillConverter (line 75) | class WordToSkillConverter: method __init__ (line 78) | def __init__(self, config): method extract_docx (line 96) | def extract_docx(self): method load_extracted_data (line 237) | def load_extracted_data(self, json_path): method categorize_content (line 246) | def categorize_content(self): method build_skill (line 318) | def build_skill(self): method _generate_reference_file (line 347) | def _generate_reference_file(self, _cat_key, cat_data, section_num, to... method _generate_index (line 443) | def _generate_index(self, categorized): method _generate_skill_md (line 496) | def _generate_skill_md(self, categorized): method _format_key_concepts (line 636) | def _format_key_concepts(self) -> str: method _format_patterns_from_content (line 675) | def _format_patterns_from_content(self) -> str: method _sanitize_filename (line 725) | def _sanitize_filename(self, name): function _build_section (line 737) | def _build_section( function _extract_table_from_html (line 855) | def _extract_table_from_html(table_elem) -> dict | None: function _score_code_quality (line 885) | def _score_code_quality(code: str) -> float: function main (line 923) | def main(): FILE: src/skill_seekers/cli/workflow_runner.py function collect_workflow_vars (line 26) | def collect_workflow_vars(args: argparse.Namespace, extra: dict | None =... function _build_inline_engine (line 42) | def _build_inline_engine(args: argparse.Namespace): function run_workflows (line 69) | def run_workflows( FILE: src/skill_seekers/cli/workflows_command.py function _ensure_user_dir (line 36) | def _ensure_user_dir() -> Path: function _bundled_yaml_text (line 41) | def _bundled_yaml_text(name: str) -> str | None: function _workflow_yaml_text (line 54) | def _workflow_yaml_text(name_or_path: str) -> str | None: function _list_user_workflow_names (line 79) | def _list_user_workflow_names() -> list[str]: function cmd_list (line 86) | def cmd_list() -> int: function cmd_show (line 126) | def cmd_show(name: str) -> int: function cmd_copy (line 137) | def cmd_copy(names: list[str]) -> int: function cmd_add (line 163) | def cmd_add(file_paths: list[str], override_name: str | None = None) -> ... function cmd_remove (line 206) | def cmd_remove(names: list[str]) -> int: function cmd_validate (line 236) | def cmd_validate(name_or_path: str) -> int: function main (line 257) | def main(argv=None) -> None: FILE: src/skill_seekers/embedding/cache.py class EmbeddingCache (line 11) | class EmbeddingCache: method __init__ (line 32) | def __init__(self, db_path: str = ":memory:", ttl_days: int = 30): method _init_db (line 51) | def _init_db(self): method set (line 77) | def set(self, hash_key: str, embedding: list[float], model: str) -> None: method get (line 103) | def get(self, hash_key: str) -> list[float] | None: method get_batch (line 152) | def get_batch(self, hash_keys: list[str]) -> tuple[list[list[float] | ... method has (line 173) | def has(self, hash_key: str) -> bool: method delete (line 207) | def delete(self, hash_key: str) -> None: method clear (line 226) | def clear(self, model: str | None = None) -> int: method clear_expired (line 254) | def clear_expired(self) -> int: method size (line 278) | def size(self) -> int: method stats (line 290) | def stats(self) -> dict: method close (line 342) | def close(self): method __enter__ (line 346) | def __enter__(self): method __exit__ (line 350) | def __exit__(self, exc_type, exc_val, exc_tb): FILE: src/skill_seekers/embedding/generator.py class EmbeddingGenerator (line 34) | class EmbeddingGenerator: method __init__ (line 131) | def __init__( method get_model_info (line 164) | def get_model_info(self, model: str) -> dict: method list_models (line 172) | def list_models(self) -> list[dict]: method generate (line 187) | def generate( method generate_batch (line 217) | def generate_batch( method _generate_openai (line 252) | def _generate_openai(self, text: str, model: str, normalize: bool) -> ... method _generate_openai_batch (line 273) | def _generate_openai_batch( method _generate_voyage (line 307) | def _generate_voyage(self, text: str, model: str, normalize: bool) -> ... method _generate_voyage_batch (line 328) | def _generate_voyage_batch( method _generate_sentence_transformer (line 362) | def _generate_sentence_transformer(self, text: str, model: str, normal... method _generate_sentence_transformer_batch (line 381) | def _generate_sentence_transformer_batch( method _normalize (line 406) | def _normalize(embedding: list[float]) -> list[float]: method compute_hash (line 415) | def compute_hash(text: str, model: str) -> str: FILE: src/skill_seekers/embedding/models.py class EmbeddingRequest (line 9) | class EmbeddingRequest(BaseModel): class BatchEmbeddingRequest (line 27) | class BatchEmbeddingRequest(BaseModel): class EmbeddingResponse (line 53) | class EmbeddingResponse(BaseModel): class BatchEmbeddingResponse (line 62) | class BatchEmbeddingResponse(BaseModel): class SkillEmbeddingRequest (line 72) | class SkillEmbeddingRequest(BaseModel): class SkillEmbeddingResponse (line 92) | class SkillEmbeddingResponse(BaseModel): class HealthResponse (line 102) | class HealthResponse(BaseModel): class ModelInfo (line 112) | class ModelInfo(BaseModel): class ModelsResponse (line 126) | class ModelsResponse(BaseModel): FILE: src/skill_seekers/embedding/server.py function root (line 80) | async def root(): function health (line 90) | async def health(): function list_models (line 104) | async def list_models(): function embed_text (line 122) | async def embed_text(request: EmbeddingRequest): function embed_batch (line 161) | async def embed_batch(request: BatchEmbeddingRequest): function embed_skill (line 226) | async def embed_skill(request: SkillEmbeddingRequest): function cache_stats (line 289) | async def cache_stats(): function clear_cache (line 297) | async def clear_cache( function clear_expired (line 309) | async def clear_expired(): function main (line 323) | def main(): FILE: src/skill_seekers/mcp/agent_detector.py class AgentDetector (line 21) | class AgentDetector: method __init__ (line 73) | def __init__(self): method detect_agents (line 77) | def detect_agents(self) -> list[dict[str, str]]: method _get_config_path (line 101) | def _get_config_path(self, agent_id: str) -> str | None: method get_transport_type (line 127) | def get_transport_type(self, agent_id: str) -> str | None: method generate_config (line 141) | def generate_config( method _generate_stdio_config (line 167) | def _generate_stdio_config(self, server_command: str) -> str: method _generate_http_config (line 186) | def _generate_http_config(self, http_port: int) -> str: method _generate_intellij_config (line 200) | def _generate_intellij_config(self, _server_command: str, http_port: i... method get_all_config_paths (line 225) | def get_all_config_paths(self) -> dict[str, str]: method is_agent_installed (line 239) | def is_agent_installed(self, agent_id: str) -> bool: method get_agent_info (line 251) | def get_agent_info(self, agent_id: str) -> dict[str, Any] | None: function detect_agents (line 276) | def detect_agents() -> list[dict[str, str]]: function generate_config (line 287) | def generate_config( function get_transport_type (line 305) | def get_transport_type(agent_name: str) -> str | None: FILE: src/skill_seekers/mcp/git_repo.py class GitConfigRepo (line 17) | class GitConfigRepo: method __init__ (line 20) | def __init__(self, cache_dir: str | None = None): method clone_or_pull (line 41) | def clone_or_pull( method find_configs (line 127) | def find_configs(self, repo_path: Path) -> list[Path]: method get_config (line 151) | def get_config(self, repo_path: Path, config_name: str) -> dict: method _load_config_file (line 191) | def _load_config_file(self, config_path: Path) -> dict: method inject_token (line 211) | def inject_token(git_url: str, token: str) -> str: method validate_git_url (line 249) | def validate_git_url(git_url: str) -> bool: FILE: src/skill_seekers/mcp/server.py function call_tool (line 66) | async def call_tool(name: str, arguments: dict): function list_tools (line 115) | async def list_tools(): FILE: src/skill_seekers/mcp/server_fastmcp.py function safe_tool_decorator (line 171) | def safe_tool_decorator(*args, **kwargs): function generate_config (line 191) | async def generate_config( function list_configs (line 229) | async def list_configs() -> str: function validate_config (line 243) | async def validate_config(config_path: str) -> str: function sync_config (line 265) | async def sync_config( function estimate_pages (line 313) | async def estimate_pages( function scrape_docs (line 343) | async def scrape_docs( function scrape_github (line 383) | async def scrape_github( function scrape_pdf (line 439) | async def scrape_pdf( function scrape_video (line 480) | async def scrape_video( function scrape_codebase (line 569) | async def scrape_codebase( function detect_patterns (line 612) | async def detect_patterns( function extract_test_examples (line 656) | async def extract_test_examples( function build_how_to_guides (line 709) | async def build_how_to_guides( function extract_config_patterns (line 757) | async def extract_config_patterns( function scrape_generic (line 831) | async def scrape_generic( function package_skill (line 880) | async def package_skill( function upload_skill (line 910) | async def upload_skill( function enhance_skill (line 942) | async def enhance_skill( function install_skill (line 977) | async def install_skill( function split_config (line 1027) | async def split_config( function generate_router (line 1064) | async def generate_router( function fetch_config (line 1096) | async def fetch_config( function submit_config (line 1150) | async def submit_config( function add_config_source (line 1187) | async def add_config_source( function list_config_sources (line 1231) | async def list_config_sources(enabled_only: bool = False) -> str: function remove_config_source (line 1250) | async def remove_config_source(name: str) -> str: function export_to_weaviate (line 1274) | async def export_to_weaviate( function export_to_chroma (line 1301) | async def export_to_chroma( function export_to_faiss (line 1328) | async def export_to_faiss( function export_to_qdrant (line 1355) | async def export_to_qdrant( function list_workflows (line 1387) | async def list_workflows() -> str: function get_workflow (line 1398) | async def get_workflow(name: str) -> str: function create_workflow (line 1417) | async def create_workflow(name: str, content: str) -> str: function update_workflow (line 1437) | async def update_workflow(name: str, content: str) -> str: function delete_workflow (line 1457) | async def delete_workflow(name: str) -> str: function parse_args (line 1478) | def parse_args(): function setup_logging (line 1534) | def setup_logging(log_level: str): function run_http_server (line 1542) | async def run_http_server(host: str, port: int): function main (line 1629) | def main(): FILE: src/skill_seekers/mcp/server_legacy.py function safe_decorator (line 54) | def safe_decorator(decorator_func): function run_subprocess_with_streaming (line 66) | def run_subprocess_with_streaming(cmd, timeout=None): function list_tools (line 137) | async def list_tools() -> list[Tool]: function call_tool (line 615) | async def call_tool(name: str, arguments: Any) -> list[TextContent]: function generate_config_tool (line 660) | async def generate_config_tool(args: dict) -> list[TextContent]: function estimate_pages_tool (line 714) | async def estimate_pages_tool(args: dict) -> list[TextContent]: function scrape_docs_tool (line 750) | async def scrape_docs_tool(args: dict) -> list[TextContent]: function package_skill_tool (line 863) | async def package_skill_tool(args: dict) -> list[TextContent]: function upload_skill_tool (line 924) | async def upload_skill_tool(args: dict) -> list[TextContent]: function list_configs_tool (line 947) | async def list_configs_tool(_args: dict) -> list[TextContent]: function validate_config_tool (line 979) | async def validate_config_tool(args: dict) -> list[TextContent]: function split_config_tool (line 1071) | async def split_config_tool(args: dict) -> list[TextContent]: function generate_router_tool (line 1108) | async def generate_router_tool(args: dict) -> list[TextContent]: function scrape_pdf_tool (line 1148) | async def scrape_pdf_tool(args: dict) -> list[TextContent]: function scrape_github_tool (line 1196) | async def scrape_github_tool(args: dict) -> list[TextContent]: function fetch_config_tool (line 1255) | async def fetch_config_tool(args: dict) -> list[TextContent]: function install_skill_tool (line 1544) | async def install_skill_tool(args: dict) -> list[TextContent]: function submit_config_tool (line 1871) | async def submit_config_tool(args: dict) -> list[TextContent]: function add_config_source_tool (line 2119) | async def add_config_source_tool(args: dict) -> list[TextContent]: function list_config_sources_tool (line 2185) | async def list_config_sources_tool(args: dict) -> list[TextContent]: function remove_config_source_tool (line 2240) | async def remove_config_source_tool(args: dict) -> list[TextContent]: function main (line 2289) | async def main(): FILE: src/skill_seekers/mcp/source_manager.py class SourceManager (line 12) | class SourceManager: method __init__ (line 15) | def __init__(self, config_dir: str | None = None): method add_source (line 37) | def add_source( method get_source (line 118) | def get_source(self, name: str) -> dict: method list_sources (line 145) | def list_sources(self, enabled_only: bool = False) -> list[dict]: method remove_source (line 162) | def remove_source(self, name: str) -> bool: method update_source (line 186) | def update_source(self, name: str, **kwargs) -> dict: method _read_registry (line 226) | def _read_registry(self) -> dict: method _write_registry (line 239) | def _write_registry(self, registry: dict) -> None: method _default_token_env (line 267) | def _default_token_env(source_type: str) -> str: FILE: src/skill_seekers/mcp/tools/config_tools.py class TextContent (line 16) | class TextContent: method __init__ (line 19) | def __init__(self, type: str, text: str): function generate_config (line 35) | async def generate_config(args: dict) -> list[TextContent]: function list_configs (line 111) | async def list_configs(_args: dict) -> list[TextContent]: function validate_config (line 154) | async def validate_config(args: dict) -> list[TextContent]: FILE: src/skill_seekers/mcp/tools/packaging_tools.py class TextContent (line 20) | class TextContent: method __init__ (line 23) | def __init__(self, type: str, text: str): function run_subprocess_with_streaming (line 32) | def run_subprocess_with_streaming(cmd: list[str], timeout: int = None) -... function package_skill_tool (line 108) | async def package_skill_tool(args: dict) -> list[TextContent]: function upload_skill_tool (line 228) | async def upload_skill_tool(args: dict) -> list[TextContent]: function enhance_skill_tool (line 292) | async def enhance_skill_tool(args: dict) -> list[TextContent]: function install_skill_tool (line 421) | async def install_skill_tool(args: dict) -> list[TextContent]: FILE: src/skill_seekers/mcp/tools/scraping_tools.py class TextContent (line 25) | class TextContent: method __init__ (line 28) | def __init__(self, type: str, text: str): function run_subprocess_with_streaming (line 37) | def run_subprocess_with_streaming(cmd: list[str], timeout: int = None) -... function estimate_pages_tool (line 116) | async def estimate_pages_tool(args: dict) -> list[TextContent]: function scrape_docs_tool (line 166) | async def scrape_docs_tool(args: dict) -> list[TextContent]: function scrape_pdf_tool (line 297) | async def scrape_pdf_tool(args: dict) -> list[TextContent]: function scrape_video_tool (line 361) | async def scrape_video_tool(args: dict) -> list[TextContent]: function scrape_github_tool (line 479) | async def scrape_github_tool(args: dict) -> list[TextContent]: function scrape_codebase_tool (line 559) | async def scrape_codebase_tool(args: dict) -> list[TextContent]: function detect_patterns_tool (line 679) | async def detect_patterns_tool(args: dict) -> list[TextContent]: function extract_test_examples_tool (line 753) | async def extract_test_examples_tool(args: dict) -> list[TextContent]: function build_how_to_guides_tool (line 841) | async def build_how_to_guides_tool(args: dict) -> list[TextContent]: function extract_config_patterns_tool (line 921) | async def extract_config_patterns_tool(args: dict) -> list[TextContent]: function scrape_generic_tool (line 1045) | async def scrape_generic_tool(args: dict) -> list[TextContent]: FILE: src/skill_seekers/mcp/tools/source_tools.py class TextContent (line 24) | class TextContent: method __init__ (line 27) | def __init__(self, type: str, text: str): function fetch_config_tool (line 36) | async def fetch_config_tool(args: dict) -> list[TextContent]: function submit_config_tool (line 347) | async def submit_config_tool(args: dict) -> list[TextContent]: function add_config_source_tool (line 621) | async def add_config_source_tool(args: dict) -> list[TextContent]: function list_config_sources_tool (line 705) | async def list_config_sources_tool(args: dict) -> list[TextContent]: function remove_config_source_tool (line 771) | async def remove_config_source_tool(args: dict) -> list[TextContent]: FILE: src/skill_seekers/mcp/tools/splitting_tools.py class TextContent (line 16) | class TextContent: method __init__ (line 19) | def __init__(self, type: str, text: str): function run_subprocess_with_streaming (line 30) | def run_subprocess_with_streaming(cmd, timeout=None): function split_config (line 103) | async def split_config(args: dict) -> list[TextContent]: function generate_router (line 164) | async def generate_router(args: dict) -> list[TextContent]: FILE: src/skill_seekers/mcp/tools/sync_config_tools.py class TextContent (line 11) | class TextContent: method __init__ (line 14) | def __init__(self, type: str, text: str): function sync_config_tool (line 19) | async def sync_config_tool(args: dict) -> list[TextContent]: FILE: src/skill_seekers/mcp/tools/vector_db_tools.py class TextContent (line 20) | class TextContent: method __init__ (line 23) | def __init__(self, type: str, text: str): function export_to_weaviate_impl (line 38) | async def export_to_weaviate_impl(args: dict) -> list[TextContent]: function export_to_chroma_impl (line 142) | async def export_to_chroma_impl(args: dict) -> list[TextContent]: function export_to_faiss_impl (line 246) | async def export_to_faiss_impl(args: dict) -> list[TextContent]: function export_to_qdrant_impl (line 365) | async def export_to_qdrant_impl(args: dict) -> list[TextContent]: FILE: src/skill_seekers/mcp/tools/workflow_tools.py class TextContent (line 22) | class TextContent: # type: ignore[no-redef] method __init__ (line 23) | def __init__(self, type: str, text: str): function _ensure_user_dir (line 31) | def _ensure_user_dir() -> Path: function _bundled_names (line 36) | def _bundled_names() -> list[str]: function _user_names (line 51) | def _user_names() -> list[str]: function _read_bundled (line 57) | def _read_bundled(name: str) -> str | None: function _read_workflow (line 69) | def _read_workflow(name: str) -> str | None: function _validate_yaml (line 78) | def _validate_yaml(text: str) -> dict: function list_workflows_tool (line 93) | def list_workflows_tool(_args: dict) -> list: function get_workflow_tool (line 123) | def get_workflow_tool(args: dict) -> list: function create_workflow_tool (line 143) | def create_workflow_tool(args: dict) -> list: function update_workflow_tool (line 172) | def update_workflow_tool(args: dict) -> list: function delete_workflow_tool (line 205) | def delete_workflow_tool(args: dict) -> list: FILE: src/skill_seekers/sync/detector.py class ChangeDetector (line 13) | class ChangeDetector: method __init__ (line 39) | def __init__(self, timeout: int = 30): method compute_hash (line 48) | def compute_hash(self, content: str) -> str: method fetch_page (line 60) | def fetch_page(self, url: str) -> tuple[str, dict[str, str]]: method check_page (line 88) | def check_page( method check_pages (line 146) | def check_pages( method generate_diff (line 203) | def generate_diff(self, old_content: str, new_content: str) -> str: method generate_summary_diff (line 221) | def generate_summary_diff(self, old_content: str, new_content: str) ->... method check_header_changes (line 245) | def check_header_changes( method batch_check_headers (line 279) | def batch_check_headers( FILE: src/skill_seekers/sync/models.py class ChangeType (line 11) | class ChangeType(str, Enum): class PageChange (line 20) | class PageChange(BaseModel): class Config (line 32) | class Config: class ChangeReport (line 45) | class ChangeReport(BaseModel): method has_changes (line 59) | def has_changes(self) -> bool: method change_count (line 64) | def change_count(self) -> int: class SyncConfig (line 69) | class SyncConfig(BaseModel): class Config (line 88) | class Config: class SyncState (line 103) | class SyncState(BaseModel): class WebhookPayload (line 118) | class WebhookPayload(BaseModel): class Config (line 127) | class Config: FILE: src/skill_seekers/sync/monitor.py class SyncMonitor (line 18) | class SyncMonitor: method __init__ (line 48) | def __init__( method _load_state (line 94) | def _load_state(self) -> SyncState: method _save_state (line 108) | def _save_state(self): method check_now (line 120) | def check_now(self, generate_diffs: bool = False) -> ChangeReport: method _notify (line 187) | def _notify(self, report: ChangeReport): method _trigger_update (line 198) | def _trigger_update(self, report: ChangeReport): method start (line 207) | def start(self): method stop (line 231) | def stop(self): method stats (line 243) | def stats(self) -> dict: method __enter__ (line 256) | def __enter__(self): method __exit__ (line 261) | def __exit__(self, exc_type, exc_val, exc_tb): FILE: src/skill_seekers/sync/notifier.py class Notifier (line 10) | class Notifier: method __init__ (line 32) | def __init__( method send (line 53) | def send(self, payload: WebhookPayload): method _send_console (line 72) | def _send_console(self, payload: WebhookPayload): method _send_webhook (line 89) | def _send_webhook(self, payload: WebhookPayload): method _send_slack (line 103) | def _send_slack(self, payload: WebhookPayload): method _send_email (line 136) | def _send_email(self, payload: WebhookPayload): FILE: test_week2_features.py function test_vector_databases (line 15) | def test_vector_databases(): function test_streaming (line 42) | def test_streaming(): function test_incremental (line 67) | def test_incremental(): function test_multilang (line 114) | def test_multilang(): function test_embeddings (line 155) | def test_embeddings(): function test_quality (line 198) | def test_quality(): function main (line 231) | def main(): FILE: tests/conftest.py function pytest_configure (line 13) | def pytest_configure(config): # noqa: ARG001 function anyio_backend (line 29) | def anyio_backend(): FILE: tests/test_adaptor_benchmarks.py class TestAdaptorBenchmarks (line 35) | class TestAdaptorBenchmarks(unittest.TestCase): method setUp (line 38) | def setUp(self): method tearDown (line 44) | def tearDown(self): method _create_skill_with_n_references (line 48) | def _create_skill_with_n_references(self, n: int, skill_name: str = "b... method test_benchmark_format_skill_md_all_adaptors (line 76) | def test_benchmark_format_skill_md_all_adaptors(self): method test_benchmark_package_operations (line 141) | def test_benchmark_package_operations(self): method test_benchmark_scaling_with_reference_count (line 188) | def test_benchmark_scaling_with_reference_count(self): method test_benchmark_json_vs_zip_size_comparison (line 245) | def test_benchmark_json_vs_zip_size_comparison(self): method test_benchmark_metadata_overhead (line 291) | def test_benchmark_metadata_overhead(self): method test_benchmark_empty_vs_full_skill (line 353) | def test_benchmark_empty_vs_full_skill(self): FILE: tests/test_adaptors/test_adaptors_e2e.py class TestAdaptorsE2E (line 23) | class TestAdaptorsE2E(unittest.TestCase): method setUp (line 26) | def setUp(self): method tearDown (line 38) | def tearDown(self): method _create_sample_skill (line 42) | def _create_sample_skill(self): method test_e2e_all_platforms_from_same_skill (line 129) | def test_e2e_all_platforms_from_same_skill(self): method test_e2e_claude_workflow (line 155) | def test_e2e_claude_workflow(self): method test_e2e_gemini_workflow (line 182) | def test_e2e_gemini_workflow(self): method test_e2e_openai_workflow (line 215) | def test_e2e_openai_workflow(self): method test_e2e_markdown_workflow (line 248) | def test_e2e_markdown_workflow(self): method test_e2e_package_format_validation (line 283) | def test_e2e_package_format_validation(self): method test_e2e_package_filename_convention (line 306) | def test_e2e_package_filename_convention(self): method test_e2e_all_platforms_preserve_references (line 324) | def test_e2e_all_platforms_preserve_references(self): method test_e2e_metadata_consistency (line 357) | def test_e2e_metadata_consistency(self): method test_e2e_format_skill_md_differences (line 384) | def test_e2e_format_skill_md_differences(self): method test_e2e_upload_without_api_key (line 408) | def test_e2e_upload_without_api_key(self): method test_e2e_markdown_no_upload_support (line 424) | def test_e2e_markdown_no_upload_support(self): class TestAdaptorsWorkflowIntegration (line 440) | class TestAdaptorsWorkflowIntegration(unittest.TestCase): method test_workflow_export_to_all_platforms (line 443) | def test_workflow_export_to_all_platforms(self): method test_workflow_package_to_custom_path (line 469) | def test_workflow_package_to_custom_path(self): method test_workflow_api_key_validation (line 489) | def test_workflow_api_key_validation(self): class TestAdaptorsErrorHandling (line 510) | class TestAdaptorsErrorHandling(unittest.TestCase): method test_error_invalid_skill_directory (line 513) | def test_error_invalid_skill_directory(self): method test_error_upload_nonexistent_file (line 535) | def test_error_upload_nonexistent_file(self): method test_error_upload_wrong_format (line 544) | def test_error_upload_wrong_format(self): class TestRAGAdaptorsE2E (line 555) | class TestRAGAdaptorsE2E(unittest.TestCase): method setUp (line 558) | def setUp(self): method tearDown (line 570) | def tearDown(self): method _create_sample_skill (line 574) | def _create_sample_skill(self): method test_e2e_all_rag_adaptors_from_same_skill (line 662) | def test_e2e_all_rag_adaptors_from_same_skill(self): method test_e2e_rag_adaptors_preserve_metadata (line 702) | def test_e2e_rag_adaptors_preserve_metadata(self): method test_e2e_rag_json_structure_validation (line 752) | def test_e2e_rag_json_structure_validation(self): method test_e2e_rag_empty_skill_handling (line 796) | def test_e2e_rag_empty_skill_handling(self): method test_e2e_rag_category_detection (line 820) | def test_e2e_rag_category_detection(self): method test_e2e_rag_integration_workflow_chromadb (line 852) | def test_e2e_rag_integration_workflow_chromadb(self): FILE: tests/test_adaptors/test_base.py class TestSkillMetadata (line 17) | class TestSkillMetadata(unittest.TestCase): method test_basic_metadata (line 20) | def test_basic_metadata(self): method test_full_metadata (line 30) | def test_full_metadata(self): class TestAdaptorRegistry (line 47) | class TestAdaptorRegistry(unittest.TestCase): method test_list_platforms (line 50) | def test_list_platforms(self): method test_is_platform_available (line 58) | def test_is_platform_available(self): method test_get_adaptor_claude (line 66) | def test_get_adaptor_claude(self): method test_get_adaptor_invalid (line 74) | def test_get_adaptor_invalid(self): method test_get_adaptor_with_config (line 83) | def test_get_adaptor_with_config(self): class TestBaseAdaptorInterface (line 91) | class TestBaseAdaptorInterface(unittest.TestCase): method setUp (line 94) | def setUp(self): method test_validate_api_key_default (line 98) | def test_validate_api_key_default(self): method test_get_env_var_name (line 104) | def test_get_env_var_name(self): method test_supports_enhancement (line 110) | def test_supports_enhancement(self): FILE: tests/test_adaptors/test_chroma_adaptor.py class TestChromaAdaptor (line 14) | class TestChromaAdaptor: method test_adaptor_registration (line 17) | def test_adaptor_registration(self): method test_format_skill_md (line 23) | def test_format_skill_md(self, tmp_path): method test_package_creates_json (line 69) | def test_package_creates_json(self, tmp_path): method test_package_output_filename (line 94) | def test_package_output_filename(self, tmp_path): method test_upload_returns_message (line 111) | def test_upload_returns_message(self, tmp_path): method test_validate_api_key_returns_false (line 128) | def test_validate_api_key_returns_false(self): method test_get_env_var_name_returns_empty (line 133) | def test_get_env_var_name_returns_empty(self): method test_supports_enhancement_returns_false (line 138) | def test_supports_enhancement_returns_false(self): method test_enhance_returns_false (line 143) | def test_enhance_returns_false(self, tmp_path): method test_empty_skill_directory (line 153) | def test_empty_skill_directory(self, tmp_path): method test_references_only (line 169) | def test_references_only(self, tmp_path): FILE: tests/test_adaptors/test_claude_adaptor.py class TestClaudeAdaptor (line 16) | class TestClaudeAdaptor(unittest.TestCase): method setUp (line 19) | def setUp(self): method test_platform_info (line 23) | def test_platform_info(self): method test_validate_api_key_valid (line 30) | def test_validate_api_key_valid(self): method test_validate_api_key_invalid (line 36) | def test_validate_api_key_invalid(self): method test_get_env_var_name (line 44) | def test_get_env_var_name(self): method test_supports_enhancement (line 48) | def test_supports_enhancement(self): method test_format_skill_md_with_frontmatter (line 52) | def test_format_skill_md_with_frontmatter(self): method test_format_skill_md_with_existing_content (line 76) | def test_format_skill_md_with_existing_content(self): method test_package_creates_zip (line 101) | def test_package_creates_zip(self): method test_package_excludes_backup_files (line 132) | def test_package_excludes_backup_files(self): method test_upload_success (line 154) | def test_upload_success(self, mock_post): method test_upload_failure (line 176) | def test_upload_failure(self, mock_post): method test_upload_invalid_file (line 191) | def test_upload_invalid_file(self): method test_upload_wrong_format (line 198) | def test_upload_wrong_format(self): method test_enhance_success (line 206) | def test_enhance_success(self): method test_package_with_custom_output_path (line 210) | def test_package_with_custom_output_path(self): method test_package_to_directory (line 229) | def test_package_to_directory(self): class TestClaudeAdaptorEdgeCases (line 248) | class TestClaudeAdaptorEdgeCases(unittest.TestCase): method setUp (line 251) | def setUp(self): method test_format_with_minimal_metadata (line 255) | def test_format_with_minimal_metadata(self): method test_format_with_special_characters_in_name (line 273) | def test_format_with_special_characters_in_name(self): method test_api_key_validation_edge_cases (line 286) | def test_api_key_validation_edge_cases(self): method test_upload_with_network_error (line 300) | def test_upload_with_network_error(self): FILE: tests/test_adaptors/test_faiss_adaptor.py class TestFAISSAdaptor (line 14) | class TestFAISSAdaptor: method test_adaptor_registration (line 17) | def test_adaptor_registration(self): method test_format_skill_md (line 23) | def test_format_skill_md(self, tmp_path): method test_package_creates_json (line 70) | def test_package_creates_json(self, tmp_path): method test_package_output_filename (line 95) | def test_package_output_filename(self, tmp_path): method test_upload_returns_message (line 112) | def test_upload_returns_message(self, tmp_path): method test_validate_api_key_returns_false (line 126) | def test_validate_api_key_returns_false(self): method test_get_env_var_name_returns_empty (line 131) | def test_get_env_var_name_returns_empty(self): method test_supports_enhancement_returns_false (line 136) | def test_supports_enhancement_returns_false(self): method test_enhance_returns_false (line 141) | def test_enhance_returns_false(self, tmp_path): method test_empty_skill_directory (line 151) | def test_empty_skill_directory(self, tmp_path): method test_references_only (line 167) | def test_references_only(self, tmp_path): FILE: tests/test_adaptors/test_gemini_adaptor.py class TestGeminiAdaptor (line 15) | class TestGeminiAdaptor(unittest.TestCase): method setUp (line 18) | def setUp(self): method test_platform_info (line 22) | def test_platform_info(self): method test_validate_api_key_valid (line 28) | def test_validate_api_key_valid(self): method test_validate_api_key_invalid (line 33) | def test_validate_api_key_invalid(self): method test_get_env_var_name (line 39) | def test_get_env_var_name(self): method test_supports_enhancement (line 43) | def test_supports_enhancement(self): method test_format_skill_md_no_frontmatter (line 47) | def test_format_skill_md_no_frontmatter(self): method test_package_creates_targz (line 66) | def test_package_creates_targz(self): method test_upload_success (line 96) | def test_upload_success(self): method test_upload_missing_library (line 100) | def test_upload_missing_library(self): method test_upload_invalid_file (line 110) | def test_upload_invalid_file(self): method test_upload_wrong_format (line 117) | def test_upload_wrong_format(self): method test_enhance_success (line 125) | def test_enhance_success(self): method test_enhance_missing_library (line 129) | def test_enhance_missing_library(self): FILE: tests/test_adaptors/test_haystack_adaptor.py class TestHaystackAdaptor (line 14) | class TestHaystackAdaptor: method test_adaptor_registration (line 17) | def test_adaptor_registration(self): method test_format_skill_md (line 23) | def test_format_skill_md(self, tmp_path): method test_package_creates_json (line 65) | def test_package_creates_json(self, tmp_path): method test_package_output_filename (line 90) | def test_package_output_filename(self, tmp_path): method test_upload_returns_message (line 107) | def test_upload_returns_message(self, tmp_path): method test_validate_api_key_returns_false (line 122) | def test_validate_api_key_returns_false(self): method test_get_env_var_name_returns_empty (line 127) | def test_get_env_var_name_returns_empty(self): method test_supports_enhancement_returns_false (line 132) | def test_supports_enhancement_returns_false(self): method test_enhance_returns_false (line 137) | def test_enhance_returns_false(self, tmp_path): method test_empty_skill_directory (line 147) | def test_empty_skill_directory(self, tmp_path): method test_references_only (line 161) | def test_references_only(self, tmp_path): FILE: tests/test_adaptors/test_langchain_adaptor.py class TestLangChainAdaptor (line 14) | class TestLangChainAdaptor: method test_adaptor_registration (line 17) | def test_adaptor_registration(self): method test_format_skill_md (line 23) | def test_format_skill_md(self, tmp_path): method test_package_creates_json (line 65) | def test_package_creates_json(self, tmp_path): method test_package_output_filename (line 90) | def test_package_output_filename(self, tmp_path): method test_upload_returns_message (line 107) | def test_upload_returns_message(self, tmp_path): method test_validate_api_key_returns_false (line 121) | def test_validate_api_key_returns_false(self): method test_get_env_var_name_returns_empty (line 126) | def test_get_env_var_name_returns_empty(self): method test_supports_enhancement_returns_false (line 131) | def test_supports_enhancement_returns_false(self): method test_enhance_returns_false (line 136) | def test_enhance_returns_false(self, tmp_path): method test_empty_skill_directory (line 146) | def test_empty_skill_directory(self, tmp_path): method test_references_only (line 160) | def test_references_only(self, tmp_path): FILE: tests/test_adaptors/test_llama_index_adaptor.py class TestLlamaIndexAdaptor (line 14) | class TestLlamaIndexAdaptor: method test_adaptor_registration (line 17) | def test_adaptor_registration(self): method test_format_skill_md (line 23) | def test_format_skill_md(self, tmp_path): method test_package_creates_json (line 65) | def test_package_creates_json(self, tmp_path): method test_package_output_filename (line 90) | def test_package_output_filename(self, tmp_path): method test_upload_returns_message (line 107) | def test_upload_returns_message(self, tmp_path): method test_validate_api_key_returns_false (line 121) | def test_validate_api_key_returns_false(self): method test_get_env_var_name_returns_empty (line 126) | def test_get_env_var_name_returns_empty(self): method test_supports_enhancement_returns_false (line 131) | def test_supports_enhancement_returns_false(self): method test_enhance_returns_false (line 136) | def test_enhance_returns_false(self, tmp_path): method test_empty_skill_directory (line 146) | def test_empty_skill_directory(self, tmp_path): method test_references_only (line 160) | def test_references_only(self, tmp_path): FILE: tests/test_adaptors/test_markdown_adaptor.py class TestMarkdownAdaptor (line 15) | class TestMarkdownAdaptor(unittest.TestCase): method setUp (line 18) | def setUp(self): method test_platform_info (line 22) | def test_platform_info(self): method test_validate_api_key (line 28) | def test_validate_api_key(self): method test_get_env_var_name (line 36) | def test_get_env_var_name(self): method test_supports_enhancement (line 40) | def test_supports_enhancement(self): method test_enhance_returns_false (line 44) | def test_enhance_returns_false(self): method test_format_skill_md_no_frontmatter (line 55) | def test_format_skill_md_no_frontmatter(self): method test_package_creates_zip (line 74) | def test_package_creates_zip(self): method test_package_readme_content (line 114) | def test_package_readme_content(self): method test_package_combined_documentation (line 134) | def test_package_combined_documentation(self): method test_package_metadata (line 168) | def test_package_metadata(self): method test_upload_not_supported (line 194) | def test_upload_not_supported(self): method test_package_output_filename (line 205) | def test_package_output_filename(self): FILE: tests/test_adaptors/test_minimax_adaptor.py class TestMiniMaxAdaptor (line 25) | class TestMiniMaxAdaptor(unittest.TestCase): method setUp (line 28) | def setUp(self): method test_platform_info (line 32) | def test_platform_info(self): method test_platform_available (line 39) | def test_platform_available(self): method test_validate_api_key_valid (line 43) | def test_validate_api_key_valid(self): method test_validate_api_key_invalid (line 51) | def test_validate_api_key_invalid(self): method test_get_env_var_name (line 57) | def test_get_env_var_name(self): method test_supports_enhancement (line 61) | def test_supports_enhancement(self): method test_format_skill_md_no_frontmatter (line 65) | def test_format_skill_md_no_frontmatter(self): method test_format_skill_md_with_existing_content (line 82) | def test_format_skill_md_with_existing_content(self): method test_format_skill_md_without_references (line 98) | def test_format_skill_md_without_references(self): method test_package_creates_zip (line 110) | def test_package_creates_zip(self): method test_package_metadata_content (line 135) | def test_package_metadata_content(self): method test_package_output_path_as_file (line 163) | def test_package_output_path_as_file(self): method test_package_without_references (line 178) | def test_package_without_references(self): method test_upload_missing_library (line 197) | def test_upload_missing_library(self): method test_upload_invalid_file (line 207) | def test_upload_invalid_file(self): method test_upload_wrong_format (line 214) | def test_upload_wrong_format(self): method test_upload_success (line 223) | def test_upload_success(self): method test_enhance_missing_references (line 227) | def test_enhance_missing_references(self): method test_enhance_success_mocked (line 236) | def test_enhance_success_mocked(self, mock_openai_class): method test_enhance_missing_library (line 262) | def test_enhance_missing_library(self): method test_read_reference_files (line 275) | def test_read_reference_files(self): method test_read_reference_files_empty_dir (line 288) | def test_read_reference_files_empty_dir(self): method test_read_reference_files_nonexistent (line 294) | def test_read_reference_files_nonexistent(self): method test_read_reference_files_truncation (line 299) | def test_read_reference_files_truncation(self): method test_build_enhancement_prompt (line 310) | def test_build_enhancement_prompt(self): method test_build_enhancement_prompt_no_existing (line 327) | def test_build_enhancement_prompt_no_existing(self): method test_config_initialization (line 336) | def test_config_initialization(self): method test_default_config (line 342) | def test_default_config(self): method test_package_excludes_backup_files (line 346) | def test_package_excludes_backup_files(self): method test_upload_success_mocked (line 368) | def test_upload_success_mocked(self, mock_openai_class): method test_upload_network_error (line 397) | def test_upload_network_error(self, mock_openai_class): method test_upload_connection_error (line 421) | def test_upload_connection_error(self, mock_openai_class): method test_validate_api_key_format (line 443) | def test_validate_api_key_format(self): class TestMiniMaxAdaptorIntegration (line 453) | class TestMiniMaxAdaptorIntegration(unittest.TestCase): method setUp (line 456) | def setUp(self): method test_enhance_with_real_api (line 463) | def test_enhance_with_real_api(self): method test_upload_with_real_api (line 488) | def test_upload_with_real_api(self): method test_validate_api_key_real (line 510) | def test_validate_api_key_real(self): FILE: tests/test_adaptors/test_openai_adaptor.py class TestOpenAIAdaptor (line 17) | class TestOpenAIAdaptor(unittest.TestCase): method setUp (line 20) | def setUp(self): method test_platform_info (line 24) | def test_platform_info(self): method test_validate_api_key_valid (line 30) | def test_validate_api_key_valid(self): method test_validate_api_key_invalid (line 36) | def test_validate_api_key_invalid(self): method test_get_env_var_name (line 43) | def test_get_env_var_name(self): method test_supports_enhancement (line 47) | def test_supports_enhancement(self): method test_format_skill_md_no_frontmatter (line 51) | def test_format_skill_md_no_frontmatter(self): method test_package_creates_zip (line 71) | def test_package_creates_zip(self): method test_upload_missing_library (line 101) | def test_upload_missing_library(self): method test_upload_invalid_file (line 112) | def test_upload_invalid_file(self): method test_upload_wrong_format (line 119) | def test_upload_wrong_format(self): method test_upload_success (line 127) | def test_upload_success(self): method test_enhance_success (line 131) | def test_enhance_success(self): method test_enhance_missing_library (line 135) | def test_enhance_missing_library(self): method test_package_includes_instructions (line 148) | def test_package_includes_instructions(self): FILE: tests/test_adaptors/test_qdrant_adaptor.py class TestQdrantAdaptor (line 14) | class TestQdrantAdaptor: method test_adaptor_registration (line 17) | def test_adaptor_registration(self): method test_format_skill_md (line 23) | def test_format_skill_md(self, tmp_path): method test_package_creates_json (line 71) | def test_package_creates_json(self, tmp_path): method test_package_output_filename (line 97) | def test_package_output_filename(self, tmp_path): method test_upload_returns_message (line 114) | def test_upload_returns_message(self, tmp_path): method test_validate_api_key_returns_false (line 128) | def test_validate_api_key_returns_false(self): method test_get_env_var_name_returns_empty (line 133) | def test_get_env_var_name_returns_empty(self): method test_supports_enhancement_returns_false (line 138) | def test_supports_enhancement_returns_false(self): method test_enhance_returns_false (line 143) | def test_enhance_returns_false(self, tmp_path): method test_empty_skill_directory (line 153) | def test_empty_skill_directory(self, tmp_path): method test_references_only (line 168) | def test_references_only(self, tmp_path): FILE: tests/test_adaptors/test_weaviate_adaptor.py class TestWeaviateAdaptor (line 14) | class TestWeaviateAdaptor: method test_adaptor_registration (line 17) | def test_adaptor_registration(self): method test_format_skill_md (line 23) | def test_format_skill_md(self, tmp_path): method test_package_creates_json (line 71) | def test_package_creates_json(self, tmp_path): method test_package_output_filename (line 97) | def test_package_output_filename(self, tmp_path): method test_upload_returns_message (line 114) | def test_upload_returns_message(self, tmp_path): method test_validate_api_key_returns_false (line 132) | def test_validate_api_key_returns_false(self): method test_get_env_var_name_returns_empty (line 137) | def test_get_env_var_name_returns_empty(self): method test_supports_enhancement_returns_false (line 142) | def test_supports_enhancement_returns_false(self): method test_enhance_returns_false (line 147) | def test_enhance_returns_false(self, tmp_path): method test_empty_skill_directory (line 157) | def test_empty_skill_directory(self, tmp_path): method test_references_only (line 172) | def test_references_only(self, tmp_path): FILE: tests/test_analyze_command.py class TestAnalyzeSubcommand (line 13) | class TestAnalyzeSubcommand(unittest.TestCase): method setUp (line 16) | def setUp(self): method test_analyze_subcommand_exists (line 20) | def test_analyze_subcommand_exists(self): method test_analyze_with_output_directory (line 26) | def test_analyze_with_output_directory(self): method test_quick_preset_flag (line 31) | def test_quick_preset_flag(self): method test_comprehensive_preset_flag (line 37) | def test_comprehensive_preset_flag(self): method test_quick_and_comprehensive_mutually_exclusive (line 43) | def test_quick_and_comprehensive_mutually_exclusive(self): method test_enhance_level_flag (line 51) | def test_enhance_level_flag(self): method test_skip_flags_passed_through (line 56) | def test_skip_flags_passed_through(self): method test_all_skip_flags (line 64) | def test_all_skip_flags(self): method test_backward_compatible_depth_flag (line 88) | def test_backward_compatible_depth_flag(self): method test_depth_flag_choices (line 93) | def test_depth_flag_choices(self): method test_languages_flag (line 99) | def test_languages_flag(self): method test_file_patterns_flag (line 106) | def test_file_patterns_flag(self): method test_no_comments_flag (line 113) | def test_no_comments_flag(self): method test_verbose_flag (line 118) | def test_verbose_flag(self): method test_complex_command_combination (line 123) | def test_complex_command_combination(self): method test_directory_is_required (line 146) | def test_directory_is_required(self): method test_default_output_directory (line 151) | def test_default_output_directory(self): class TestAnalyzePresetBehavior (line 157) | class TestAnalyzePresetBehavior(unittest.TestCase): method setUp (line 160) | def setUp(self): method test_quick_preset_implies_surface_depth (line 164) | def test_quick_preset_implies_surface_depth(self): method test_comprehensive_preset_implies_full_depth (line 170) | def test_comprehensive_preset_implies_full_depth(self): method test_enhance_level_standalone (line 176) | def test_enhance_level_standalone(self): class TestAnalyzeWorkflowFlags (line 184) | class TestAnalyzeWorkflowFlags(unittest.TestCase): method setUp (line 187) | def setUp(self): method test_enhance_workflow_accepted_as_list (line 191) | def test_enhance_workflow_accepted_as_list(self): method test_enhance_workflow_chained_twice (line 198) | def test_enhance_workflow_chained_twice(self): method test_enhance_stage_accepted_as_list (line 213) | def test_enhance_stage_accepted_as_list(self): method test_var_accepted_as_list (line 220) | def test_var_accepted_as_list(self): method test_workflow_dry_run_flag (line 225) | def test_workflow_dry_run_flag(self): method test_api_key_stored_correctly (line 230) | def test_api_key_stored_correctly(self): method test_dry_run_stored_correctly (line 235) | def test_dry_run_stored_correctly(self): method test_workflow_flags_combined (line 240) | def test_workflow_flags_combined(self): FILE: tests/test_analyze_e2e.py class TestAnalyzeCommandE2E (line 18) | class TestAnalyzeCommandE2E(unittest.TestCase): method setUpClass (line 22) | def setUpClass(cls): method tearDownClass (line 28) | def tearDownClass(cls): method create_sample_codebase (line 34) | def create_sample_codebase(cls): method run_command (line 82) | def run_command(self, *args, timeout=120): method test_analyze_help_shows_command (line 90) | def test_analyze_help_shows_command(self): method test_analyze_subcommand_help (line 97) | def test_analyze_subcommand_help(self): method test_analyze_quick_preset (line 106) | def test_analyze_quick_preset(self): method test_analyze_with_custom_output (line 140) | def test_analyze_with_custom_output(self): method test_analyze_skip_flags_work (line 152) | def test_analyze_skip_flags_work(self): method test_analyze_invalid_directory (line 172) | def test_analyze_invalid_directory(self): method test_analyze_missing_directory_arg (line 185) | def test_analyze_missing_directory_arg(self): method test_backward_compatibility_depth_flag (line 196) | def test_backward_compatibility_depth_flag(self): method test_analyze_generates_references (line 213) | def test_analyze_generates_references(self): method test_analyze_output_structure (line 228) | def test_analyze_output_structure(self): class TestAnalyzeOldCommand (line 250) | class TestAnalyzeOldCommand(unittest.TestCase): method test_old_command_still_exists (line 253) | def test_old_command_still_exists(self): class TestAnalyzeIntegration (line 264) | class TestAnalyzeIntegration(unittest.TestCase): method setUp (line 267) | def setUp(self): method tearDown (line 278) | def tearDown(self): method test_analyze_then_check_output (line 283) | def test_analyze_then_check_output(self): method test_analyze_verbose_flag (line 316) | def test_analyze_verbose_flag(self): FILE: tests/test_api_reference_builder.py class TestAPIReferenceBuilder (line 26) | class TestAPIReferenceBuilder(unittest.TestCase): method setUp (line 29) | def setUp(self): method tearDown (line 34) | def tearDown(self): method test_class_formatting (line 38) | def test_class_formatting(self): method test_function_formatting (line 87) | def test_function_formatting(self): method test_parameter_table_generation (line 124) | def test_parameter_table_generation(self): method test_markdown_output_structure (line 164) | def test_markdown_output_structure(self): method test_integration_with_code_analyzer (line 214) | def test_integration_with_code_analyzer(self): method test_async_function_indicator (line 288) | def test_async_function_indicator(self): method test_empty_analysis_skipped (line 321) | def test_empty_analysis_skipped(self): FILE: tests/test_architecture_scenarios.py class TestScenario1GitHubThreeStream (line 38) | class TestScenario1GitHubThreeStream: method mock_github_repo (line 65) | def mock_github_repo(self, tmp_path): method mock_github_api_data (line 160) | def mock_github_api_data(self): method test_scenario_1_github_three_stream_fetcher (line 206) | def test_scenario_1_github_three_stream_fetcher(self, mock_github_repo... method test_scenario_1_unified_analyzer_github (line 250) | def test_scenario_1_unified_analyzer_github(self, mock_github_repo, mo... method test_scenario_1_router_generation (line 319) | def test_scenario_1_router_generation(self, tmp_path): method test_scenario_1_quality_metrics (line 427) | def test_scenario_1_quality_metrics(self, tmp_path): # noqa: ARG002 class TestScenario2MultiSource (line 485) | class TestScenario2MultiSource: method test_scenario_2_issue_categorization (line 519) | def test_scenario_2_issue_categorization(self): method test_scenario_2_conflict_detection (line 574) | def test_scenario_2_conflict_detection(self): method test_scenario_2_multi_layer_merge (line 597) | def test_scenario_2_multi_layer_merge(self): class TestScenario3LocalCodebase (line 648) | class TestScenario3LocalCodebase: method local_codebase (line 672) | def local_codebase(self, tmp_path): method test_scenario_3_local_analysis_basic (line 720) | def test_scenario_3_local_analysis_basic(self, local_codebase): method test_scenario_3_local_analysis_c3x (line 742) | def test_scenario_3_local_analysis_c3x(self, local_codebase): method test_scenario_3_router_without_github (line 778) | def test_scenario_3_router_without_github(self, tmp_path): class TestQualityMetricsValidation (line 829) | class TestQualityMetricsValidation: method test_github_overhead_within_limits (line 834) | def test_github_overhead_within_limits(self): method test_router_size_within_limits (line 948) | def test_router_size_within_limits(self): method test_content_quality_requirements (line 956) | def test_content_quality_requirements(self): class TestTokenEfficiencyCalculation (line 1018) | class TestTokenEfficiencyCalculation: method test_token_efficiency_calculation (line 1025) | def test_token_efficiency_calculation(self): FILE: tests/test_async_scraping.py class TestAsyncConfiguration (line 17) | class TestAsyncConfiguration(unittest.TestCase): method setUp (line 20) | def setUp(self): method tearDown (line 24) | def tearDown(self): method test_async_mode_default_false (line 28) | def test_async_mode_default_false(self): method test_async_mode_enabled_from_config (line 45) | def test_async_mode_enabled_from_config(self): method test_async_mode_with_workers (line 63) | def test_async_mode_with_workers(self): class TestAsyncScrapeMethods (line 83) | class TestAsyncScrapeMethods(unittest.TestCase): method setUp (line 86) | def setUp(self): method tearDown (line 90) | def tearDown(self): method test_scrape_page_async_exists (line 94) | def test_scrape_page_async_exists(self): method test_scrape_all_async_exists (line 111) | def test_scrape_all_async_exists(self): class TestAsyncRouting (line 129) | class TestAsyncRouting(unittest.TestCase): method setUp (line 132) | def setUp(self): method tearDown (line 136) | def tearDown(self): method test_scrape_all_routes_to_async_when_enabled (line 140) | def test_scrape_all_routes_to_async_when_enabled(self): method test_scrape_all_uses_sync_when_async_disabled (line 165) | def test_scrape_all_uses_sync_when_async_disabled(self): class TestAsyncDryRun (line 194) | class TestAsyncDryRun(unittest.TestCase): method setUp (line 197) | def setUp(self): method tearDown (line 201) | def tearDown(self): method test_async_dry_run_completes (line 205) | def test_async_dry_run_completes(self): class TestAsyncErrorHandling (line 230) | class TestAsyncErrorHandling(unittest.TestCase): method setUp (line 233) | def setUp(self): method tearDown (line 237) | def tearDown(self): method test_async_handles_http_errors (line 241) | def test_async_handles_http_errors(self): class TestAsyncPerformance (line 278) | class TestAsyncPerformance(unittest.TestCase): method test_async_uses_semaphore_for_concurrency_control (line 281) | def test_async_uses_semaphore_for_concurrency_control(self): class TestAsyncLlmsTxtIntegration (line 304) | class TestAsyncLlmsTxtIntegration(unittest.TestCase): method test_async_respects_llms_txt (line 307) | def test_async_respects_llms_txt(self): FILE: tests/test_benchmark.py class TestBenchmarkResult (line 23) | class TestBenchmarkResult: method test_result_initialization (line 26) | def test_result_initialization(self): method test_add_timing (line 39) | def test_add_timing(self): method test_add_memory (line 51) | def test_add_memory(self): method test_add_metric (line 65) | def test_add_metric(self): method test_add_recommendation (line 77) | def test_add_recommendation(self): method test_set_system_info (line 86) | def test_set_system_info(self): method test_to_report (line 96) | def test_to_report(self): class TestBenchmark (line 112) | class TestBenchmark: method test_benchmark_initialization (line 115) | def test_benchmark_initialization(self): method test_timer_context_manager (line 122) | def test_timer_context_manager(self): method test_timer_with_iterations (line 133) | def test_timer_with_iterations(self): method test_memory_context_manager (line 144) | def test_memory_context_manager(self): method test_measure_function (line 156) | def test_measure_function(self): method test_measure_with_memory_tracking (line 170) | def test_measure_with_memory_tracking(self): method test_timed_decorator (line 182) | def test_timed_decorator(self): method test_timed_decorator_with_memory (line 197) | def test_timed_decorator_with_memory(self): method test_metric_recording (line 210) | def test_metric_recording(self): method test_recommendation_recording (line 220) | def test_recommendation_recording(self): method test_report_generation (line 229) | def test_report_generation(self): method test_save_report (line 245) | def test_save_report(self, tmp_path): method test_analyze_bottlenecks (line 264) | def test_analyze_bottlenecks(self): method test_analyze_high_memory (line 281) | def test_analyze_high_memory(self): class TestBenchmarkRunner (line 302) | class TestBenchmarkRunner: method test_runner_initialization (line 305) | def test_runner_initialization(self, tmp_path): method test_run_benchmark (line 312) | def test_run_benchmark(self, tmp_path): method test_run_benchmark_no_save (line 330) | def test_run_benchmark_no_save(self, tmp_path): method test_run_suite (line 346) | def test_run_suite(self, tmp_path): method test_compare_benchmarks (line 368) | def test_compare_benchmarks(self, tmp_path): method test_list_benchmarks (line 397) | def test_list_benchmarks(self, tmp_path): method test_get_latest (line 415) | def test_get_latest(self, tmp_path): method test_get_latest_not_found (line 433) | def test_get_latest_not_found(self, tmp_path): method test_cleanup_old (line 441) | def test_cleanup_old(self, tmp_path): class TestBenchmarkModels (line 487) | class TestBenchmarkModels: method test_timing_result_model (line 490) | def test_timing_result_model(self): method test_memory_usage_model (line 499) | def test_memory_usage_model(self): method test_metric_model (line 509) | def test_metric_model(self): method test_benchmark_report_summary (line 518) | def test_benchmark_report_summary(self): method test_comparison_report_has_regressions (line 546) | def test_comparison_report_has_regressions(self): method test_comparison_report_overall_improvement (line 586) | def test_comparison_report_overall_improvement(self): FILE: tests/test_bootstrap_skill.py function project_root (line 10) | def project_root(): class TestBootstrapSkillScript (line 15) | class TestBootstrapSkillScript: method test_script_exists (line 18) | def test_script_exists(self, project_root): method test_header_template_exists (line 24) | def test_header_template_exists(self, project_root): method test_header_has_required_sections (line 29) | def test_header_has_required_sections(self, project_root): method test_header_has_yaml_frontmatter (line 44) | def test_header_has_yaml_frontmatter(self, project_root): method test_bootstrap_script_runs (line 54) | def test_bootstrap_script_runs(self, project_root): FILE: tests/test_bootstrap_skill_e2e.py function project_root (line 33) | def project_root(): function run_bootstrap (line 39) | def run_bootstrap(project_root): function output_skill_dir (line 55) | def output_skill_dir(project_root): class TestBootstrapSkillE2E (line 61) | class TestBootstrapSkillE2E: method test_bootstrap_creates_output_structure (line 64) | def test_bootstrap_creates_output_structure(self, run_bootstrap, outpu... method test_bootstrap_prepends_header (line 73) | def test_bootstrap_prepends_header(self, run_bootstrap, output_skill_d... method test_bootstrap_validates_yaml_frontmatter (line 85) | def test_bootstrap_validates_yaml_frontmatter(self, run_bootstrap, out... method test_bootstrap_output_line_count (line 109) | def test_bootstrap_output_line_count(self, run_bootstrap, output_skill... method test_skill_installable_in_venv (line 122) | def test_skill_installable_in_venv(self, run_bootstrap, output_skill_d... method test_skill_packageable_with_adaptors (line 145) | def test_skill_packageable_with_adaptors(self, run_bootstrap, output_s... FILE: tests/test_c3_integration.py class TestC3Integration (line 28) | class TestC3Integration: method temp_dir (line 32) | def temp_dir(self): method mock_config (line 39) | def mock_config(self, temp_dir): method mock_c3_data (line 57) | def mock_c3_data(self): method test_codebase_analysis_enabled_by_default (line 139) | def test_codebase_analysis_enabled_by_default(self, mock_config, temp_... method test_skip_codebase_analysis_flag (line 160) | def test_skip_codebase_analysis_flag(self, mock_config, temp_dir): method test_architecture_md_generation (line 179) | def test_architecture_md_generation(self, mock_config, mock_c3_data, t... method test_c3_reference_directory_structure (line 220) | def test_c3_reference_directory_structure(self, mock_config, mock_c3_d... method test_graceful_degradation_on_c3_failure (line 262) | def test_graceful_degradation_on_c3_failure(self, mock_config, temp_dir): method test_config_validator_accepts_c3_properties (line 291) | def test_config_validator_accepts_c3_properties(self, temp_dir): method test_config_validator_rejects_invalid_ai_mode (line 315) | def test_config_validator_rejects_invalid_ai_mode(self, temp_dir): method test_skill_md_includes_c3_summary (line 339) | def test_skill_md_includes_c3_summary(self, mock_config, mock_c3_data,... FILE: tests/test_chunking_integration.py function create_test_skill (line 17) | def create_test_skill(tmp_path: Path, large_doc: bool = False) -> Path: class TestChunkingDisabledByDefault (line 56) | class TestChunkingDisabledByDefault: method test_langchain_no_chunking_default (line 59) | def test_langchain_no_chunking_default(self, tmp_path): class TestChunkingEnabled (line 78) | class TestChunkingEnabled: method test_langchain_chunking_enabled (line 81) | def test_langchain_chunking_enabled(self, tmp_path): method test_chunking_preserves_small_docs (line 106) | def test_chunking_preserves_small_docs(self, tmp_path): class TestCodeBlockPreservation (line 125) | class TestCodeBlockPreservation: method test_preserve_code_blocks (line 128) | def test_preserve_code_blocks(self, tmp_path): class TestAutoChunkingForRAGPlatforms (line 181) | class TestAutoChunkingForRAGPlatforms: method test_rag_platforms_auto_chunk (line 192) | def test_rag_platforms_auto_chunk(self, platform, tmp_path): class TestBaseAdaptorChunkingHelper (line 222) | class TestBaseAdaptorChunkingHelper: method test_maybe_chunk_content_disabled (line 225) | def test_maybe_chunk_content_disabled(self): method test_maybe_chunk_content_small_doc (line 241) | def test_maybe_chunk_content_small_doc(self): method test_maybe_chunk_content_large_doc (line 257) | def test_maybe_chunk_content_large_doc(self): class TestChunkingCLIIntegration (line 290) | class TestChunkingCLIIntegration: method test_chunk_flag (line 293) | def test_chunk_flag(self, tmp_path): method test_chunk_tokens_parameter (line 318) | def test_chunk_tokens_parameter(self, tmp_path): method test_chunk_overlap_tokens_parameter (line 361) | def test_chunk_overlap_tokens_parameter(self, tmp_path): method test_chunk_overlap_scales_with_chunk_size (line 406) | def test_chunk_overlap_scales_with_chunk_size(self, tmp_path): method test_preserve_code_blocks_flag (line 442) | def test_preserve_code_blocks_flag(self, tmp_path): FILE: tests/test_cli_parsers.py class TestParserRegistry (line 22) | class TestParserRegistry: method test_all_parsers_registered (line 25) | def test_all_parsers_registered(self): method test_get_parser_names (line 29) | def test_get_parser_names(self): method test_all_parsers_are_subcommand_parsers (line 42) | def test_all_parsers_are_subcommand_parsers(self): method test_all_parsers_have_required_properties (line 47) | def test_all_parsers_have_required_properties(self): method test_all_parsers_have_add_arguments_method (line 59) | def test_all_parsers_have_add_arguments_method(self): method test_no_duplicate_parser_names (line 65) | def test_no_duplicate_parser_names(self): class TestParserCreation (line 71) | class TestParserCreation: method test_scrape_parser_creates_subparser (line 74) | def test_scrape_parser_creates_subparser(self): method test_github_parser_creates_subparser (line 86) | def test_github_parser_creates_subparser(self): method test_package_parser_creates_subparser (line 97) | def test_package_parser_creates_subparser(self): method test_register_parsers_creates_all_subcommands (line 108) | def test_register_parsers_creates_all_subcommands(self): class TestSpecificParsers (line 133) | class TestSpecificParsers: method test_scrape_parser_arguments (line 136) | def test_scrape_parser_arguments(self): method test_github_parser_arguments (line 155) | def test_github_parser_arguments(self): method test_package_parser_arguments (line 170) | def test_package_parser_arguments(self): method test_analyze_parser_arguments (line 188) | def test_analyze_parser_arguments(self): class TestBackwardCompatibility (line 212) | class TestBackwardCompatibility: method test_all_original_commands_still_work (line 215) | def test_all_original_commands_still_work(self): method test_command_count_matches (line 245) | def test_command_count_matches(self): FILE: tests/test_cli_paths.py class TestModernCLICommands (line 17) | class TestModernCLICommands(unittest.TestCase): method test_doc_scraper_uses_modern_commands (line 20) | def test_doc_scraper_uses_modern_commands(self): method test_enhance_skill_local_uses_modern_commands (line 35) | def test_enhance_skill_local_uses_modern_commands(self): method test_estimate_pages_uses_modern_commands (line 54) | def test_estimate_pages_uses_modern_commands(self): method test_package_skill_uses_modern_commands (line 69) | def test_package_skill_uses_modern_commands(self): method test_github_scraper_uses_modern_commands (line 84) | def test_github_scraper_uses_modern_commands(self): class TestUnifiedCLIEntryPoints (line 100) | class TestUnifiedCLIEntryPoints(unittest.TestCase): method test_main_cli_help_output (line 103) | def test_main_cli_help_output(self): method test_main_cli_version_output (line 127) | def test_main_cli_version_output(self): class TestNoHardcodedPaths (line 148) | class TestNoHardcodedPaths(unittest.TestCase): method test_no_hardcoded_paths_in_cli_scripts (line 151) | def test_no_hardcoded_paths_in_cli_scripts(self): class TestPackageStructure (line 173) | class TestPackageStructure(unittest.TestCase): method test_src_layout_exists (line 176) | def test_src_layout_exists(self): method test_cli_package_exists (line 181) | def test_cli_package_exists(self): method test_mcp_package_exists (line 189) | def test_mcp_package_exists(self): method test_main_cli_file_exists (line 197) | def test_main_cli_file_exists(self): FILE: tests/test_cli_refactor_e2e.py class TestParserSync (line 17) | class TestParserSync: method test_scrape_interactive_flag_works (line 20) | def test_scrape_interactive_flag_works(self): method test_scrape_chunk_for_rag_flag_works (line 29) | def test_scrape_chunk_for_rag_flag_works(self): method test_scrape_verbose_flag_works (line 40) | def test_scrape_verbose_flag_works(self): method test_scrape_url_flag_works (line 48) | def test_scrape_url_flag_works(self): method test_github_all_flags_present (line 55) | def test_github_all_flags_present(self): class TestPresetSystem (line 71) | class TestPresetSystem: method test_analyze_preset_flag_exists (line 74) | def test_analyze_preset_flag_exists(self): method test_analyze_preset_list_flag_exists (line 84) | def test_analyze_preset_list_flag_exists(self): method test_preset_list_shows_presets (line 91) | def test_preset_list_shows_presets(self): method test_deprecated_quick_flag_shows_warning (line 103) | def test_deprecated_quick_flag_shows_warning(self, tmp_path): method test_deprecated_comprehensive_flag_shows_warning (line 115) | def test_deprecated_comprehensive_flag_shows_warning(self, tmp_path): class TestBackwardCompatibility (line 127) | class TestBackwardCompatibility: method test_old_scrape_command_still_works (line 130) | def test_old_scrape_command_still_works(self): method test_unified_cli_and_standalone_have_same_args (line 136) | def test_unified_cli_and_standalone_have_same_args(self): class TestProgrammaticAPI (line 163) | class TestProgrammaticAPI: method test_import_shared_scrape_arguments (line 166) | def test_import_shared_scrape_arguments(self): method test_import_shared_github_arguments (line 177) | def test_import_shared_github_arguments(self): method test_import_analyze_presets (line 188) | def test_import_analyze_presets(self): class TestIntegration (line 205) | class TestIntegration: method test_unified_cli_subcommands_registered (line 208) | def test_unified_cli_subcommands_registered(self): method test_scrape_help_detailed (line 227) | def test_scrape_help_detailed(self): method test_analyze_help_shows_presets (line 238) | def test_analyze_help_shows_presets(self): class TestE2EWorkflow (line 250) | class TestE2EWorkflow: method test_dry_run_scrape_with_new_args (line 254) | def test_dry_run_scrape_with_new_args(self, tmp_path): method test_analyze_with_preset_flag (line 278) | def test_analyze_with_preset_flag(self, tmp_path): class TestVarFlagRouting (line 297) | class TestVarFlagRouting: method test_var_flag_accepted_by_create (line 300) | def test_var_flag_accepted_by_create(self): method test_var_flag_accepted_by_analyze (line 309) | def test_var_flag_accepted_by_analyze(self): method test_var_flag_not_rejected_in_create_local (line 319) | def test_var_flag_not_rejected_in_create_local(self, tmp_path): class TestBackwardCompatibleFlags (line 343) | class TestBackwardCompatibleFlags: method test_no_preserve_code_alias_accepted_by_package (line 346) | def test_no_preserve_code_alias_accepted_by_package(self): method test_no_preserve_code_alias_accepted_by_scrape (line 357) | def test_no_preserve_code_alias_accepted_by_scrape(self): method test_no_preserve_code_alias_accepted_by_create (line 366) | def test_no_preserve_code_alias_accepted_by_create(self): FILE: tests/test_cloud_storage.py function test_get_storage_adaptor_s3 (line 48) | def test_get_storage_adaptor_s3(): function test_get_storage_adaptor_gcs (line 57) | def test_get_storage_adaptor_gcs(): function test_get_storage_adaptor_azure (line 66) | def test_get_storage_adaptor_azure(): function test_get_storage_adaptor_invalid_provider (line 79) | def test_get_storage_adaptor_invalid_provider(): function test_s3_upload_file (line 90) | def test_s3_upload_file(): function test_s3_download_file (line 118) | def test_s3_download_file(): function test_s3_list_files (line 140) | def test_s3_list_files(): function test_s3_file_exists (line 178) | def test_s3_file_exists(): function test_s3_get_file_url (line 196) | def test_s3_get_file_url(): function test_gcs_upload_file (line 222) | def test_gcs_upload_file(): function test_gcs_download_file (line 254) | def test_gcs_download_file(): function test_gcs_list_files (line 280) | def test_gcs_list_files(): function test_azure_upload_file (line 314) | def test_azure_upload_file(): function test_azure_download_file (line 349) | def test_azure_download_file(): function test_azure_list_files (line 382) | def test_azure_list_files(): function test_storage_object (line 420) | def test_storage_object(): function test_base_adaptor_abstract (line 435) | def test_base_adaptor_abstract(): function test_upload_directory (line 446) | def test_upload_directory(): function test_download_directory (line 473) | def test_download_directory(): function test_missing_dependencies (line 516) | def test_missing_dependencies(): FILE: tests/test_code_analyzer.py class TestPythonParsing (line 23) | class TestPythonParsing(unittest.TestCase): method setUp (line 26) | def setUp(self): method test_python_function_signature_basic (line 30) | def test_python_function_signature_basic(self): method test_python_function_with_type_hints (line 49) | def test_python_function_with_type_hints(self): method test_python_function_with_defaults (line 67) | def test_python_function_with_defaults(self): method test_python_async_function (line 84) | def test_python_async_function(self): method test_python_class_extraction (line 98) | def test_python_class_extraction(self): method test_python_docstring_extraction (line 134) | def test_python_docstring_extraction(self): method test_python_decorators (line 168) | def test_python_decorators(self): method test_python_syntax_error_handling (line 197) | def test_python_syntax_error_handling(self): class TestJavaScriptParsing (line 212) | class TestJavaScriptParsing(unittest.TestCase): method setUp (line 215) | def setUp(self): method test_javascript_function_basic (line 219) | def test_javascript_function_basic(self): method test_javascript_arrow_function (line 235) | def test_javascript_arrow_function(self): method test_javascript_class_methods (line 253) | def test_javascript_class_methods(self): method test_typescript_type_annotations (line 288) | def test_typescript_type_annotations(self): method test_javascript_async_detection (line 327) | def test_javascript_async_detection(self): class TestCppParsing (line 350) | class TestCppParsing(unittest.TestCase): method setUp (line 353) | def setUp(self): method test_cpp_function_signature (line 357) | def test_cpp_function_signature(self): method test_cpp_class_extraction (line 376) | def test_cpp_class_extraction(self): method test_cpp_pointer_parameters (line 406) | def test_cpp_pointer_parameters(self): method test_cpp_default_parameters (line 422) | def test_cpp_default_parameters(self): class TestDepthLevels (line 443) | class TestDepthLevels(unittest.TestCase): method test_surface_depth_returns_empty (line 446) | def test_surface_depth_returns_empty(self): method test_deep_depth_extracts_signatures (line 459) | def test_deep_depth_extracts_signatures(self): method test_unknown_language_returns_empty (line 476) | def test_unknown_language_returns_empty(self): class TestIntegration (line 491) | class TestIntegration(unittest.TestCase): method test_analyze_file_interface (line 494) | def test_analyze_file_interface(self): method test_multiple_items_extraction (line 513) | def test_multiple_items_extraction(self): class TestCommentExtraction (line 553) | class TestCommentExtraction(unittest.TestCase): method setUp (line 556) | def setUp(self): method test_python_comment_extraction (line 560) | def test_python_comment_extraction(self): method test_python_comment_line_numbers (line 592) | def test_python_comment_line_numbers(self): method test_python_skip_shebang_and_encoding (line 611) | def test_python_skip_shebang_and_encoding(self): method test_javascript_inline_comments (line 627) | def test_javascript_inline_comments(self): method test_javascript_block_comments (line 652) | def test_javascript_block_comments(self): method test_javascript_mixed_comments (line 675) | def test_javascript_mixed_comments(self): method test_cpp_comment_extraction (line 697) | def test_cpp_comment_extraction(self): method test_todo_fixme_comment_detection (line 725) | def test_todo_fixme_comment_detection(self): class TestCSharpParsing (line 745) | class TestCSharpParsing(unittest.TestCase): method setUp (line 748) | def setUp(self): method test_csharp_class_extraction (line 751) | def test_csharp_class_extraction(self): method test_csharp_method_extraction (line 770) | def test_csharp_method_extraction(self): method test_csharp_property_extraction (line 791) | def test_csharp_property_extraction(self): method test_csharp_async_method (line 807) | def test_csharp_async_method(self): class TestGoParsing (line 827) | class TestGoParsing(unittest.TestCase): method setUp (line 830) | def setUp(self): method test_go_function_extraction (line 833) | def test_go_function_extraction(self): method test_go_method_with_receiver (line 851) | def test_go_method_with_receiver(self): method test_go_struct_extraction (line 872) | def test_go_struct_extraction(self): method test_go_multiple_return_values (line 890) | def test_go_multiple_return_values(self): class TestRustParsing (line 907) | class TestRustParsing(unittest.TestCase): method setUp (line 910) | def setUp(self): method test_rust_function_extraction (line 913) | def test_rust_function_extraction(self): method test_rust_struct_extraction (line 929) | def test_rust_struct_extraction(self): method test_rust_async_function (line 945) | def test_rust_async_function(self): method test_rust_impl_block (line 959) | def test_rust_impl_block(self): class TestJavaParsing (line 978) | class TestJavaParsing(unittest.TestCase): method setUp (line 981) | def setUp(self): method test_java_class_extraction (line 984) | def test_java_class_extraction(self): method test_java_method_extraction (line 1000) | def test_java_method_extraction(self): method test_java_interface_implementation (line 1018) | def test_java_interface_implementation(self): method test_java_generic_class (line 1031) | def test_java_generic_class(self): class TestRubyParsing (line 1048) | class TestRubyParsing(unittest.TestCase): method setUp (line 1051) | def setUp(self): method test_ruby_class_extraction (line 1054) | def test_ruby_class_extraction(self): method test_ruby_method_extraction (line 1071) | def test_ruby_method_extraction(self): method test_ruby_class_inheritance (line 1086) | def test_ruby_class_inheritance(self): method test_ruby_predicate_methods (line 1102) | def test_ruby_predicate_methods(self): class TestPHPParsing (line 1116) | class TestPHPParsing(unittest.TestCase): method setUp (line 1119) | def setUp(self): method test_php_class_extraction (line 1122) | def test_php_class_extraction(self): method test_php_method_extraction (line 1143) | def test_php_method_extraction(self): method test_php_class_inheritance (line 1160) | def test_php_class_inheritance(self): method test_php_namespace (line 1178) | def test_php_namespace(self): FILE: tests/test_codebase_scraper.py class TestLanguageDetection (line 39) | class TestLanguageDetection(unittest.TestCase): method test_python_detection (line 42) | def test_python_detection(self): method test_javascript_detection (line 46) | def test_javascript_detection(self): method test_typescript_detection (line 51) | def test_typescript_detection(self): method test_cpp_detection (line 56) | def test_cpp_detection(self): method test_csharp_detection (line 62) | def test_csharp_detection(self): method test_go_detection (line 66) | def test_go_detection(self): method test_rust_detection (line 70) | def test_rust_detection(self): method test_java_detection (line 74) | def test_java_detection(self): method test_ruby_detection (line 78) | def test_ruby_detection(self): method test_php_detection (line 82) | def test_php_detection(self): method test_unknown_language (line 86) | def test_unknown_language(self): class TestDirectoryExclusion (line 92) | class TestDirectoryExclusion(unittest.TestCase): method test_node_modules_excluded (line 95) | def test_node_modules_excluded(self): method test_venv_excluded (line 99) | def test_venv_excluded(self): method test_git_excluded (line 103) | def test_git_excluded(self): method test_normal_dir_not_excluded (line 107) | def test_normal_dir_not_excluded(self): class TestDirectoryWalking (line 113) | class TestDirectoryWalking(unittest.TestCase): method setUp (line 116) | def setUp(self): method tearDown (line 121) | def tearDown(self): method test_walk_empty_directory (line 125) | def test_walk_empty_directory(self): method test_walk_with_python_files (line 130) | def test_walk_with_python_files(self): method test_walk_excludes_node_modules (line 143) | def test_walk_excludes_node_modules(self): method test_walk_with_subdirectories (line 159) | def test_walk_with_subdirectories(self): class TestGitignoreLoading (line 179) | class TestGitignoreLoading(unittest.TestCase): method setUp (line 182) | def setUp(self): method tearDown (line 187) | def tearDown(self): method test_no_gitignore (line 191) | def test_no_gitignore(self): method test_load_gitignore (line 197) | def test_load_gitignore(self): class TestMarkdownDocumentation (line 212) | class TestMarkdownDocumentation(unittest.TestCase): method setUp (line 215) | def setUp(self): method tearDown (line 220) | def tearDown(self): method test_markdown_extensions (line 224) | def test_markdown_extensions(self): method test_root_doc_categories (line 229) | def test_root_doc_categories(self): method test_folder_categories (line 235) | def test_folder_categories(self): method test_walk_markdown_files (line 242) | def test_walk_markdown_files(self): method test_categorize_root_readme (line 260) | def test_categorize_root_readme(self): method test_categorize_changelog (line 268) | def test_categorize_changelog(self): method test_categorize_docs_guide (line 276) | def test_categorize_docs_guide(self): method test_categorize_architecture (line 286) | def test_categorize_architecture(self): class TestMarkdownStructureExtraction (line 297) | class TestMarkdownStructureExtraction(unittest.TestCase): method test_extract_headers (line 300) | def test_extract_headers(self): method test_extract_code_blocks (line 319) | def test_extract_code_blocks(self): method test_extract_links (line 338) | def test_extract_links(self): method test_word_and_line_count (line 350) | def test_word_and_line_count(self): class TestMarkdownSummaryGeneration (line 359) | class TestMarkdownSummaryGeneration(unittest.TestCase): method test_generate_summary_with_title (line 362) | def test_generate_summary_with_title(self): method test_generate_summary_with_sections (line 370) | def test_generate_summary_with_sections(self): method test_generate_summary_truncation (line 388) | def test_generate_summary_truncation(self): class TestReferenceGeneration (line 397) | class TestReferenceGeneration(unittest.TestCase): method setUp (line 400) | def setUp(self): method tearDown (line 406) | def tearDown(self): method test_no_duplicate_directories_created (line 411) | def test_no_duplicate_directories_created(self): method test_no_disk_space_wasted (line 445) | def test_no_disk_space_wasted(self): FILE: tests/test_config_extractor.py class TestConfigFileDetector (line 34) | class TestConfigFileDetector(unittest.TestCase): method setUp (line 37) | def setUp(self): method tearDown (line 41) | def tearDown(self): method test_detect_json_files (line 47) | def test_detect_json_files(self): method test_detect_yaml_files (line 62) | def test_detect_yaml_files(self): method test_detect_env_files (line 72) | def test_detect_env_files(self): method test_detect_python_config (line 82) | def test_detect_python_config(self): method test_max_files_limit (line 92) | def test_max_files_limit(self): class TestConfigParser (line 104) | class TestConfigParser(unittest.TestCase): method setUp (line 107) | def setUp(self): method tearDown (line 111) | def tearDown(self): method test_parse_json_config (line 116) | def test_parse_json_config(self): method test_parse_yaml_config (line 137) | def test_parse_yaml_config(self): method test_parse_env_file (line 165) | def test_parse_env_file(self): method test_parse_ini_file (line 193) | def test_parse_ini_file(self): method test_parse_python_config (line 217) | def test_parse_python_config(self): method test_parse_dockerfile (line 242) | def test_parse_dockerfile(self): method test_parse_javascript_config (line 265) | def test_parse_javascript_config(self): method test_parse_toml_config (line 294) | def test_parse_toml_config(self): class TestConfigPatternDetector (line 327) | class TestConfigPatternDetector(unittest.TestCase): method setUp (line 330) | def setUp(self): method test_detect_database_pattern (line 333) | def test_detect_database_pattern(self): method test_detect_api_pattern (line 355) | def test_detect_api_pattern(self): method test_detect_logging_pattern (line 375) | def test_detect_logging_pattern(self): method test_detect_cache_pattern (line 395) | def test_detect_cache_pattern(self): method test_detect_email_pattern (line 415) | def test_detect_email_pattern(self): method test_detect_auth_pattern (line 436) | def test_detect_auth_pattern(self): method test_detect_server_pattern (line 456) | def test_detect_server_pattern(self): class TestConfigExtractorIntegration (line 477) | class TestConfigExtractorIntegration(unittest.TestCase): method setUp (line 480) | def setUp(self): method tearDown (line 484) | def tearDown(self): method test_extract_from_directory (line 489) | def test_extract_from_directory(self): method test_generate_markdown_output (line 500) | def test_generate_markdown_output(self): method test_generate_json_output (line 524) | def test_generate_json_output(self): method test_empty_directory (line 548) | def test_empty_directory(self): method test_save_results (line 555) | def test_save_results(self): class TestEdgeCases (line 566) | class TestEdgeCases(unittest.TestCase): method setUp (line 569) | def setUp(self): method tearDown (line 573) | def tearDown(self): method test_parse_empty_file (line 578) | def test_parse_empty_file(self): method test_parse_invalid_json (line 594) | def test_parse_invalid_json(self): method test_nonexistent_file (line 609) | def test_nonexistent_file(self): FILE: tests/test_config_fetcher.py class TestFetchConfigFromApi (line 16) | class TestFetchConfigFromApi: method test_successful_fetch (line 20) | def test_successful_fetch(self, mock_client_class, tmp_path): method test_config_not_found (line 70) | def test_config_not_found(self, mock_client_class): method test_no_download_url (line 84) | def test_no_download_url(self, mock_client_class): method test_http_error (line 100) | def test_http_error(self, mock_client_class): method test_json_decode_error (line 112) | def test_json_decode_error(self, mock_client_class): method test_normalize_config_name (line 127) | def test_normalize_config_name(self, tmp_path): class TestListAvailableConfigs (line 161) | class TestListAvailableConfigs: method test_successful_list (line 165) | def test_successful_list(self, mock_client_class): method test_category_filter (line 190) | def test_category_filter(self, mock_client_class): method test_api_error (line 213) | def test_api_error(self, mock_client_class): class TestResolveConfigPath (line 225) | class TestResolveConfigPath: method test_exact_path_exists (line 228) | def test_exact_path_exists(self, tmp_path): method test_with_configs_prefix (line 239) | def test_with_configs_prefix(self, tmp_path): method test_auto_fetch_disabled (line 260) | def test_auto_fetch_disabled(self): method test_auto_fetch_enabled (line 266) | def test_auto_fetch_enabled(self, mock_fetch, tmp_path): method test_auto_fetch_failed (line 282) | def test_auto_fetch_failed(self, mock_fetch): method test_config_name_normalization (line 290) | def test_config_name_normalization(self, tmp_path): class TestConfigFetcherIntegration (line 316) | class TestConfigFetcherIntegration: method test_fetch_real_config (line 319) | def test_fetch_real_config(self, tmp_path): method test_list_real_configs (line 333) | def test_list_real_configs(self): FILE: tests/test_config_validation.py class TestConfigValidation (line 17) | class TestConfigValidation(unittest.TestCase): method test_valid_minimal_config (line 20) | def test_valid_minimal_config(self): method test_valid_complete_config (line 27) | def test_valid_complete_config(self): method test_missing_name (line 46) | def test_missing_name(self): method test_missing_base_url (line 52) | def test_missing_base_url(self): method test_invalid_name_special_chars (line 58) | def test_invalid_name_special_chars(self): method test_valid_name_formats (line 64) | def test_valid_name_formats(self): method test_invalid_base_url_no_protocol (line 73) | def test_invalid_base_url_no_protocol(self): method test_valid_url_protocols (line 79) | def test_valid_url_protocols(self): method test_invalid_selectors_not_dict (line 87) | def test_invalid_selectors_not_dict(self): method test_missing_recommended_selectors (line 95) | def test_missing_recommended_selectors(self): method test_invalid_url_patterns_not_dict (line 109) | def test_invalid_url_patterns_not_dict(self): method test_invalid_url_patterns_include_not_list (line 120) | def test_invalid_url_patterns_include_not_list(self): method test_invalid_categories_not_dict (line 132) | def test_invalid_categories_not_dict(self): method test_invalid_category_keywords_not_list (line 140) | def test_invalid_category_keywords_not_list(self): method test_invalid_rate_limit_negative (line 152) | def test_invalid_rate_limit_negative(self): method test_invalid_rate_limit_too_high (line 158) | def test_invalid_rate_limit_too_high(self): method test_invalid_rate_limit_not_number (line 164) | def test_invalid_rate_limit_not_number(self): method test_valid_rate_limit_range (line 170) | def test_valid_rate_limit_range(self): method test_invalid_max_pages_zero (line 178) | def test_invalid_max_pages_zero(self): method test_invalid_max_pages_too_high (line 184) | def test_invalid_max_pages_too_high(self): method test_invalid_max_pages_not_int (line 190) | def test_invalid_max_pages_not_int(self): method test_valid_max_pages_range (line 196) | def test_valid_max_pages_range(self): method test_invalid_start_urls_not_list (line 204) | def test_invalid_start_urls_not_list(self): method test_invalid_start_urls_bad_protocol (line 216) | def test_invalid_start_urls_bad_protocol(self): method test_valid_start_urls (line 226) | def test_valid_start_urls(self): method test_config_with_llms_txt_url (line 241) | def test_config_with_llms_txt_url(self): method test_config_with_skip_llms_txt (line 252) | def test_config_with_skip_llms_txt(self): method test_config_with_skip_llms_txt_false (line 260) | def test_config_with_skip_llms_txt_false(self): FILE: tests/test_constants.py class TestConstants (line 32) | class TestConstants(unittest.TestCase): method test_scraping_constants_exist (line 35) | def test_scraping_constants_exist(self): method test_scraping_constants_types (line 41) | def test_scraping_constants_types(self): method test_scraping_constants_ranges (line 47) | def test_scraping_constants_ranges(self): method test_content_analysis_constants (line 56) | def test_content_analysis_constants(self): method test_categorization_constants (line 62) | def test_categorization_constants(self): method test_enhancement_constants_exist (line 72) | def test_enhancement_constants_exist(self): method test_enhancement_constants_values (line 79) | def test_enhancement_constants_values(self): method test_enhancement_limits_hierarchy (line 86) | def test_enhancement_limits_hierarchy(self): method test_estimation_constants (line 93) | def test_estimation_constants(self): method test_file_limit_constants (line 99) | def test_file_limit_constants(self): class TestConstantsUsage (line 107) | class TestConstantsUsage(unittest.TestCase): method test_doc_scraper_imports_constants (line 110) | def test_doc_scraper_imports_constants(self): method test_estimate_pages_imports_constants (line 118) | def test_estimate_pages_imports_constants(self): method test_enhance_skill_imports_constants (line 128) | def test_enhance_skill_imports_constants(self): method test_enhance_skill_local_imports_constants (line 140) | def test_enhance_skill_local_imports_constants(self): class TestConstantsExports (line 147) | class TestConstantsExports(unittest.TestCase): method test_all_exports_exist (line 150) | def test_all_exports_exist(self): method test_all_exports_count (line 160) | def test_all_exports_count(self): FILE: tests/test_create_arguments.py class TestUniversalArguments (line 24) | class TestUniversalArguments: method test_universal_count (line 27) | def test_universal_count(self): method test_universal_argument_names (line 31) | def test_universal_argument_names(self): method test_all_universal_have_flags (line 57) | def test_all_universal_have_flags(self): method test_all_universal_have_kwargs (line 63) | def test_all_universal_have_kwargs(self): class TestSourceSpecificArguments (line 70) | class TestSourceSpecificArguments: method test_web_arguments_exist (line 73) | def test_web_arguments_exist(self): method test_github_arguments_exist (line 80) | def test_github_arguments_exist(self): method test_local_arguments_exist (line 87) | def test_local_arguments_exist(self): method test_pdf_arguments_exist (line 94) | def test_pdf_arguments_exist(self): method test_no_duplicate_flags_across_sources (line 100) | def test_no_duplicate_flags_across_sources(self): class TestAdvancedArguments (line 117) | class TestAdvancedArguments: method test_advanced_arguments_exist (line 120) | def test_advanced_arguments_exist(self): class TestArgumentHelpers (line 127) | class TestArgumentHelpers: method test_get_universal_argument_names (line 130) | def test_get_universal_argument_names(self): method test_get_source_specific_web (line 144) | def test_get_source_specific_web(self): method test_get_source_specific_github (line 149) | def test_get_source_specific_github(self): method test_get_source_specific_local (line 154) | def test_get_source_specific_local(self): method test_get_source_specific_pdf (line 159) | def test_get_source_specific_pdf(self): method test_get_source_specific_config (line 164) | def test_get_source_specific_config(self): method test_get_source_specific_unknown (line 171) | def test_get_source_specific_unknown(self): class TestCompatibleArguments (line 177) | class TestCompatibleArguments: method test_web_compatible_arguments (line 180) | def test_web_compatible_arguments(self): method test_github_compatible_arguments (line 195) | def test_github_compatible_arguments(self): method test_local_compatible_arguments (line 209) | def test_local_compatible_arguments(self): method test_pdf_compatible_arguments (line 220) | def test_pdf_compatible_arguments(self): method test_config_compatible_arguments (line 231) | def test_config_compatible_arguments(self): class TestAddCreateArguments (line 250) | class TestAddCreateArguments: method test_default_mode_adds_universal_only (line 253) | def test_default_mode_adds_universal_only(self): method test_web_mode_adds_web_arguments (line 271) | def test_web_mode_adds_web_arguments(self): method test_all_mode_adds_all_arguments (line 287) | def test_all_mode_adds_all_arguments(self): method test_positional_source_argument_always_added (line 308) | def test_positional_source_argument_always_added(self): class TestNoDuplicates (line 321) | class TestNoDuplicates: method test_no_duplicates_between_universal_and_web (line 324) | def test_no_duplicates_between_universal_and_web(self): method test_no_duplicates_between_source_specific_args (line 335) | def test_no_duplicates_between_source_specific_args(self): class TestArgumentQuality (line 351) | class TestArgumentQuality: method test_all_arguments_have_help_text (line 354) | def test_all_arguments_have_help_text(self): method test_boolean_arguments_use_store_true (line 369) | def test_boolean_arguments_use_store_true(self): FILE: tests/test_create_integration_basic.py class TestCreateCommandBasic (line 10) | class TestCreateCommandBasic: method test_create_command_help (line 13) | def test_create_command_help(self): method test_create_detects_web_url (line 25) | def test_create_detects_web_url(self): method test_create_detects_github_repo (line 38) | def test_create_detects_github_repo(self): method test_create_detects_local_directory (line 51) | def test_create_detects_local_directory(self, tmp_path): method test_create_detects_pdf_file (line 68) | def test_create_detects_pdf_file(self, tmp_path): method test_create_detects_config_file (line 85) | def test_create_detects_config_file(self, tmp_path): method test_create_invalid_source_shows_error (line 104) | def test_create_invalid_source_shows_error(self): method test_create_supports_universal_flags (line 116) | def test_create_supports_universal_flags(self): class TestCreateCommandArgvForwarding (line 133) | class TestCreateCommandArgvForwarding: method _make_args (line 136) | def _make_args(self, **kwargs): method _collect_argv (line 164) | def _collect_argv(self, args): method test_single_enhance_workflow_forwarded (line 172) | def test_single_enhance_workflow_forwarded(self): method test_multiple_enhance_workflows_all_forwarded (line 178) | def test_multiple_enhance_workflows_all_forwarded(self): method test_no_enhance_workflow_not_forwarded (line 188) | def test_no_enhance_workflow_not_forwarded(self): method test_single_enhance_stage_forwarded (line 195) | def test_single_enhance_stage_forwarded(self): method test_multiple_enhance_stages_all_forwarded (line 201) | def test_multiple_enhance_stages_all_forwarded(self): method test_enhance_stage_none_not_forwarded (line 209) | def test_enhance_stage_none_not_forwarded(self): method test_single_var_forwarded (line 216) | def test_single_var_forwarded(self): method test_multiple_vars_all_forwarded (line 222) | def test_multiple_vars_all_forwarded(self): method test_var_none_not_forwarded (line 229) | def test_var_none_not_forwarded(self): method test_workflow_dry_run_forwarded (line 236) | def test_workflow_dry_run_forwarded(self): method test_workflow_dry_run_false_not_forwarded (line 241) | def test_workflow_dry_run_false_not_forwarded(self): method test_workflow_and_stage_both_forwarded (line 248) | def test_workflow_and_stage_both_forwarded(self): class TestBackwardCompatibility (line 263) | class TestBackwardCompatibility: method test_scrape_command_still_works (line 266) | def test_scrape_command_still_works(self): method test_github_command_still_works (line 276) | def test_github_command_still_works(self): method test_analyze_command_still_works (line 286) | def test_analyze_command_still_works(self): method test_main_help_shows_all_commands (line 296) | def test_main_help_shows_all_commands(self): method test_workflows_command_still_works (line 312) | def test_workflows_command_still_works(self): FILE: tests/test_dependency_analyzer.py class TestPythonImportExtraction (line 26) | class TestPythonImportExtraction(unittest.TestCase): method setUp (line 29) | def setUp(self): method test_simple_import (line 34) | def test_simple_import(self): method test_from_import (line 44) | def test_from_import(self): method test_relative_import (line 53) | def test_relative_import(self): method test_import_as (line 64) | def test_import_as(self): method test_syntax_error_handling (line 73) | def test_syntax_error_handling(self): class TestJavaScriptImportExtraction (line 82) | class TestJavaScriptImportExtraction(unittest.TestCase): method setUp (line 85) | def setUp(self): method test_es6_import (line 90) | def test_es6_import(self): method test_commonjs_require (line 100) | def test_commonjs_require(self): method test_relative_import_js (line 109) | def test_relative_import_js(self): method test_mixed_imports (line 119) | def test_mixed_imports(self): class TestCppIncludeExtraction (line 135) | class TestCppIncludeExtraction(unittest.TestCase): method setUp (line 138) | def setUp(self): method test_system_includes (line 143) | def test_system_includes(self): method test_local_includes (line 153) | def test_local_includes(self): method test_mixed_includes (line 162) | def test_mixed_includes(self): class TestDependencyGraphBuilding (line 177) | class TestDependencyGraphBuilding(unittest.TestCase): method setUp (line 180) | def setUp(self): method test_simple_graph (line 185) | def test_simple_graph(self): method test_multiple_dependencies (line 197) | def test_multiple_dependencies(self): method test_chain_dependencies (line 208) | def test_chain_dependencies(self): class TestCircularDependencyDetection (line 220) | class TestCircularDependencyDetection(unittest.TestCase): method setUp (line 223) | def setUp(self): method test_no_circular_dependencies (line 228) | def test_no_circular_dependencies(self): method test_simple_circular_dependency (line 238) | def test_simple_circular_dependency(self): method test_three_way_cycle (line 252) | def test_three_way_cycle(self): class TestGraphExport (line 265) | class TestGraphExport(unittest.TestCase): method setUp (line 268) | def setUp(self): method tearDown (line 274) | def tearDown(self): method test_export_json (line 277) | def test_export_json(self): method test_export_mermaid (line 290) | def test_export_mermaid(self): method test_get_statistics (line 302) | def test_get_statistics(self): class TestCSharpImportExtraction (line 318) | class TestCSharpImportExtraction(unittest.TestCase): method setUp (line 321) | def setUp(self): method test_simple_using (line 326) | def test_simple_using(self): method test_using_alias (line 336) | def test_using_alias(self): method test_using_static (line 344) | def test_using_static(self): class TestGoImportExtraction (line 353) | class TestGoImportExtraction(unittest.TestCase): method setUp (line 356) | def setUp(self): method test_simple_import (line 361) | def test_simple_import(self): method test_import_with_alias (line 371) | def test_import_with_alias(self): method test_multi_import_block (line 379) | def test_multi_import_block(self): class TestRustImportExtraction (line 395) | class TestRustImportExtraction(unittest.TestCase): method setUp (line 398) | def setUp(self): method test_simple_use (line 403) | def test_simple_use(self): method test_use_crate (line 413) | def test_use_crate(self): method test_use_super (line 422) | def test_use_super(self): method test_use_curly_braces (line 430) | def test_use_curly_braces(self): class TestJavaImportExtraction (line 441) | class TestJavaImportExtraction(unittest.TestCase): method setUp (line 444) | def setUp(self): method test_simple_import (line 449) | def test_simple_import(self): method test_wildcard_import (line 459) | def test_wildcard_import(self): method test_static_import (line 467) | def test_static_import(self): class TestRubyImportExtraction (line 476) | class TestRubyImportExtraction(unittest.TestCase): method setUp (line 479) | def setUp(self): method test_simple_require (line 484) | def test_simple_require(self): method test_require_relative (line 494) | def test_require_relative(self): method test_load_statement (line 504) | def test_load_statement(self): class TestPHPImportExtraction (line 514) | class TestPHPImportExtraction(unittest.TestCase): method setUp (line 517) | def setUp(self): method test_require_statement (line 522) | def test_require_statement(self): method test_include_statement (line 532) | def test_include_statement(self): method test_namespace_use (line 540) | def test_namespace_use(self): class TestEdgeCases (line 551) | class TestEdgeCases(unittest.TestCase): method setUp (line 554) | def setUp(self): method test_empty_file (line 559) | def test_empty_file(self): method test_unsupported_language (line 565) | def test_unsupported_language(self): method test_file_with_only_comments (line 572) | def test_file_with_only_comments(self): FILE: tests/test_e2e_three_stream_pipeline.py class TestE2EBasicWorkflow (line 28) | class TestE2EBasicWorkflow: method test_github_url_to_basic_analysis (line 32) | def test_github_url_to_basic_analysis(self, mock_fetcher_class, tmp_pa... method test_issue_categorization_by_topic (line 154) | def test_issue_categorization_by_topic(self): class TestE2ERouterGeneration (line 225) | class TestE2ERouterGeneration: method test_router_generation_with_github_streams (line 228) | def test_router_generation_with_github_streams(self, tmp_path): class TestE2EQualityMetrics (line 404) | class TestE2EQualityMetrics: method test_github_overhead_within_limits (line 407) | def test_github_overhead_within_limits(self, tmp_path): method test_router_size_within_limits (line 471) | def test_router_size_within_limits(self, tmp_path): class TestE2EBackwardCompatibility (line 501) | class TestE2EBackwardCompatibility: method test_router_without_github_streams (line 504) | def test_router_without_github_streams(self, tmp_path): method test_analyzer_without_github_metadata (line 537) | def test_analyzer_without_github_metadata(self, mock_fetcher_class, tm... class TestE2ETokenEfficiency (line 564) | class TestE2ETokenEfficiency: method test_three_stream_produces_compact_output (line 567) | def test_three_stream_produces_compact_output(self, tmp_path): FILE: tests/test_embedding.py function test_cache_init (line 30) | def test_cache_init(): function test_cache_set_get (line 36) | def test_cache_set_get(): function test_cache_has (line 47) | def test_cache_has(): function test_cache_delete (line 58) | def test_cache_delete(): function test_cache_clear (line 72) | def test_cache_clear(): function test_cache_stats (line 93) | def test_cache_stats(): function test_cache_context_manager (line 108) | def test_cache_context_manager(): function test_generator_init (line 129) | def test_generator_init(): function test_generator_list_models (line 135) | def test_generator_list_models(): function test_generator_get_model_info (line 146) | def test_generator_get_model_info(): function test_generator_get_model_info_invalid (line 157) | def test_generator_get_model_info_invalid(): function test_generator_compute_hash (line 165) | def test_generator_compute_hash(): function test_generator_sentence_transformers_not_available (line 183) | def test_generator_sentence_transformers_not_available(): function test_generator_openai_not_available (line 192) | def test_generator_openai_not_available(): function test_generator_voyage_not_available (line 201) | def test_generator_voyage_not_available(): function test_generator_voyage_model_info (line 209) | def test_generator_voyage_model_info(): function test_generator_voyage_large_2_model_info (line 220) | def test_generator_voyage_large_2_model_info(): function test_embedding_request (line 236) | def test_embedding_request(): function test_batch_embedding_request (line 245) | def test_batch_embedding_request(): function test_embedding_response (line 255) | def test_embedding_response(): function test_batch_embedding_response (line 266) | def test_batch_embedding_response(): function test_health_response (line 281) | def test_health_response(): function test_model_info (line 296) | def test_model_info(): function test_cache_batch_operations (line 316) | def test_cache_batch_operations(): function test_generator_normalize (line 337) | def test_generator_normalize(): function test_cache_persistence (line 349) | def test_cache_persistence(): FILE: tests/test_embedding_pipeline.py function test_local_provider_generation (line 33) | def test_local_provider_generation(): function test_local_provider_deterministic (line 45) | def test_local_provider_deterministic(): function test_local_provider_cost (line 57) | def test_local_provider_cost(): function test_cache_memory (line 65) | def test_cache_memory(): function test_cache_miss (line 80) | def test_cache_miss(): function test_cache_disk (line 88) | def test_cache_disk(): function test_cost_tracker (line 108) | def test_cost_tracker(): function test_pipeline_initialization (line 125) | def test_pipeline_initialization(): function test_pipeline_generate_batch (line 136) | def test_pipeline_generate_batch(): function test_pipeline_caching (line 151) | def test_pipeline_caching(): function test_pipeline_batch_processing (line 177) | def test_pipeline_batch_processing(): function test_validate_dimensions_valid (line 195) | def test_validate_dimensions_valid(): function test_validate_dimensions_invalid (line 207) | def test_validate_dimensions_invalid(): function test_embedding_result_metadata (line 220) | def test_embedding_result_metadata(): function test_cost_stats (line 235) | def test_cost_stats(): function test_empty_batch (line 251) | def test_empty_batch(): function test_single_document (line 263) | def test_single_document(): function test_different_dimensions (line 275) | def test_different_dimensions(): FILE: tests/test_enhance_command.py function _make_args (line 14) | def _make_args(**kwargs): function _make_skill_dir (line 33) | def _make_skill_dir(tmp_path): class TestIsRoot (line 45) | class TestIsRoot: method test_returns_bool (line 46) | def test_returns_bool(self): method test_not_root_when_monkeypatched (line 51) | def test_not_root_when_monkeypatched(self, monkeypatch): method test_root_when_uid_zero (line 59) | def test_root_when_uid_zero(self, monkeypatch): method test_windows_no_getuid (line 67) | def test_windows_no_getuid(self, monkeypatch): class TestPickModeExplicitTarget (line 83) | class TestPickModeExplicitTarget: method test_target_gemini_forces_api (line 84) | def test_target_gemini_forces_api(self, monkeypatch): method test_target_openai_forces_api (line 96) | def test_target_openai_forces_api(self, monkeypatch): method test_target_claude_forces_api (line 106) | def test_target_claude_forces_api(self, monkeypatch): class TestPickModeAutoDetect (line 122) | class TestPickModeAutoDetect: method test_anthropic_key_selects_claude (line 123) | def test_anthropic_key_selects_claude(self, monkeypatch): method test_google_key_selects_gemini (line 134) | def test_google_key_selects_gemini(self, monkeypatch): method test_openai_key_selects_openai (line 146) | def test_openai_key_selects_openai(self, monkeypatch): method test_no_keys_falls_back_to_local (line 158) | def test_no_keys_falls_back_to_local(self, monkeypatch): method test_anthropic_takes_priority_over_google (line 170) | def test_anthropic_takes_priority_over_google(self, monkeypatch): class TestPickModeConfigAgent (line 188) | class TestPickModeConfigAgent: method _patch_config (line 189) | def _patch_config(self, monkeypatch, agent: str | None): method test_config_gemini_with_key_uses_gemini (line 196) | def test_config_gemini_with_key_uses_gemini(self, monkeypatch): method test_config_gemini_without_key_falls_to_autodetect (line 208) | def test_config_gemini_without_key_falls_to_autodetect(self, monkeypat... method test_config_agent_overridden_by_explicit_target (line 221) | def test_config_agent_overridden_by_explicit_target(self, monkeypatch): class TestEnhanceArgumentParsing (line 239) | class TestEnhanceArgumentParsing: method _parse (line 242) | def _parse(self, argv, tmp_path): method test_target_gemini (line 250) | def test_target_gemini(self, tmp_path): method test_target_openai (line 254) | def test_target_openai(self, tmp_path): method test_api_key_stored (line 258) | def test_api_key_stored(self, tmp_path): method test_dry_run (line 262) | def test_dry_run(self, tmp_path): method test_no_target_defaults_none (line 266) | def test_no_target_defaults_none(self, tmp_path): method test_invalid_target_rejected (line 270) | def test_invalid_target_rejected(self, tmp_path): class TestEnhanceCommandMain (line 285) | class TestEnhanceCommandMain: method test_dry_run_no_ai_call (line 286) | def test_dry_run_no_ai_call(self, tmp_path): method test_missing_dir_returns_error (line 298) | def test_missing_dir_returns_error(self, tmp_path): method test_root_local_mode_blocked (line 309) | def test_root_local_mode_blocked(self, monkeypatch, tmp_path): method test_root_api_mode_allowed (line 329) | def test_root_api_mode_allowed(self, monkeypatch, tmp_path): class TestConfigManagerDefaultAgent (line 359) | class TestConfigManagerDefaultAgent: method test_get_default_agent_none_by_default (line 360) | def test_get_default_agent_none_by_default(self, tmp_path, monkeypatch): method test_set_and_get_default_agent (line 370) | def test_set_and_get_default_agent(self, tmp_path, monkeypatch): method test_set_default_agent_persisted (line 381) | def test_set_default_agent_persisted(self, tmp_path, monkeypatch): FILE: tests/test_enhance_skill_local.py function _make_skill_dir (line 12) | def _make_skill_dir(tmp_path): function _allow_executable (line 19) | def _allow_executable(monkeypatch, name="my-agent"): class TestMultiAgentSupport (line 26) | class TestMultiAgentSupport: method test_agent_presets_structure (line 29) | def test_agent_presets_structure(self): method test_build_agent_command_claude (line 38) | def test_build_agent_command_claude(self, tmp_path): method test_build_agent_command_codex (line 51) | def test_build_agent_command_codex(self, tmp_path): method test_build_agent_command_custom_with_placeholder (line 65) | def test_build_agent_command_custom_with_placeholder(self, tmp_path, m... method test_custom_agent_requires_command (line 83) | def test_custom_agent_requires_command(self, tmp_path): method test_invalid_agent_name (line 90) | def test_invalid_agent_name(self, tmp_path): method test_agent_normalization (line 97) | def test_agent_normalization(self, tmp_path): method test_environment_variable_agent (line 105) | def test_environment_variable_agent(self, tmp_path, monkeypatch): method test_environment_variable_custom_command (line 114) | def test_environment_variable_custom_command(self, tmp_path, monkeypat... method test_rejects_command_with_semicolon (line 126) | def test_rejects_command_with_semicolon(self, tmp_path): method test_rejects_command_with_pipe (line 137) | def test_rejects_command_with_pipe(self, tmp_path): method test_rejects_command_with_background_job (line 148) | def test_rejects_command_with_background_job(self, tmp_path): method test_rejects_missing_executable (line 159) | def test_rejects_missing_executable(self, tmp_path, monkeypatch): function _make_skill_dir_with_refs (line 177) | def _make_skill_dir_with_refs(tmp_path, ref_content="# Ref\nSome referen... class TestDetectTerminalApp (line 193) | class TestDetectTerminalApp: method test_skill_seeker_terminal_takes_priority (line 194) | def test_skill_seeker_terminal_takes_priority(self, monkeypatch): method test_term_program_iterm_mapped (line 201) | def test_term_program_iterm_mapped(self, monkeypatch): method test_term_program_apple_terminal_mapped (line 208) | def test_term_program_apple_terminal_mapped(self, monkeypatch): method test_term_program_ghostty_mapped (line 214) | def test_term_program_ghostty_mapped(self, monkeypatch): method test_unknown_term_program_falls_back_to_terminal (line 220) | def test_unknown_term_program_falls_back_to_terminal(self, monkeypatch): method test_no_env_defaults_to_terminal (line 227) | def test_no_env_defaults_to_terminal(self, monkeypatch): method test_skill_seeker_overrides_term_program (line 234) | def test_skill_seeker_overrides_term_program(self, monkeypatch): class TestStatusReadWrite (line 247) | class TestStatusReadWrite: method test_write_and_read_status (line 248) | def test_write_and_read_status(self, tmp_path): method test_write_status_creates_file (line 261) | def test_write_status_creates_file(self, tmp_path): method test_read_status_returns_none_if_no_file (line 268) | def test_read_status_returns_none_if_no_file(self, tmp_path): method test_write_status_includes_timestamp (line 273) | def test_write_status_includes_timestamp(self, tmp_path): method test_write_status_error_field (line 282) | def test_write_status_error_field(self, tmp_path): method test_read_status_returns_none_on_corrupt_file (line 291) | def test_read_status_returns_none_on_corrupt_file(self, tmp_path): method test_multiple_writes_last_wins (line 298) | def test_multiple_writes_last_wins(self, tmp_path): class TestSummarizeReference (line 315) | class TestSummarizeReference: method _enhancer (line 316) | def _enhancer(self, tmp_path): method test_short_content_unchanged_intro (line 320) | def test_short_content_unchanged_intro(self, tmp_path): method test_extracts_code_blocks (line 329) | def test_extracts_code_blocks(self, tmp_path): method test_preserves_headings (line 338) | def test_preserves_headings(self, tmp_path): method test_adds_truncation_notice (line 346) | def test_adds_truncation_notice(self, tmp_path): method test_target_ratio_applied (line 352) | def test_target_ratio_applied(self, tmp_path): method test_code_blocks_not_arbitrarily_capped (line 359) | def test_code_blocks_not_arbitrarily_capped(self, tmp_path): class TestCreateEnhancementPrompt (line 377) | class TestCreateEnhancementPrompt: method test_returns_string_with_references (line 378) | def test_returns_string_with_references(self, tmp_path): method test_prompt_contains_skill_name (line 386) | def test_prompt_contains_skill_name(self, tmp_path): method test_prompt_contains_current_skill_md (line 392) | def test_prompt_contains_current_skill_md(self, tmp_path): method test_prompt_contains_reference_content (line 399) | def test_prompt_contains_reference_content(self, tmp_path): method test_returns_none_when_no_references (line 405) | def test_returns_none_when_no_references(self, tmp_path): method test_summarization_applied_when_requested (line 415) | def test_summarization_applied_when_requested(self, tmp_path): method test_prompt_includes_task_instructions (line 426) | def test_prompt_includes_task_instructions(self, tmp_path): class TestRunHeadless (line 440) | class TestRunHeadless: method _make_skill_with_md (line 441) | def _make_skill_with_md(self, tmp_path, md_content="# Original\nInitia... method test_returns_false_when_agent_not_found (line 446) | def test_returns_false_when_agent_not_found(self, tmp_path): method test_returns_false_on_nonzero_exit (line 457) | def test_returns_false_on_nonzero_exit(self, tmp_path): method test_returns_false_when_skill_md_not_updated (line 469) | def test_returns_false_when_skill_md_not_updated(self, tmp_path): method test_returns_true_when_skill_md_updated (line 483) | def test_returns_true_when_skill_md_updated(self, tmp_path): class TestRunOrchestration (line 511) | class TestRunOrchestration: method test_run_returns_false_for_missing_skill_dir (line 512) | def test_run_returns_false_for_missing_skill_dir(self, tmp_path): method test_run_returns_false_when_no_references (line 518) | def test_run_returns_false_when_no_references(self, tmp_path): method test_run_delegates_to_background (line 527) | def test_run_delegates_to_background(self, tmp_path): method test_run_delegates_to_daemon (line 537) | def test_run_delegates_to_daemon(self, tmp_path): method test_run_calls_run_headless_in_headless_mode (line 547) | def test_run_calls_run_headless_in_headless_mode(self, tmp_path): class TestRunBackground (line 563) | class TestRunBackground: method test_background_writes_pending_status (line 564) | def test_background_writes_pending_status(self, tmp_path): method test_background_returns_true_immediately (line 582) | def test_background_returns_true_immediately(self, tmp_path): class TestEnhanceDispatcher (line 604) | class TestEnhanceDispatcher: method test_detect_api_target_anthropic (line 607) | def test_detect_api_target_anthropic(self, monkeypatch): method test_detect_api_target_google (line 617) | def test_detect_api_target_google(self, monkeypatch): method test_detect_api_target_openai (line 628) | def test_detect_api_target_openai(self, monkeypatch): method test_detect_api_target_none (line 639) | def test_detect_api_target_none(self, monkeypatch): method test_detect_api_target_anthropic_priority (line 650) | def test_detect_api_target_anthropic_priority(self, monkeypatch): method test_detect_api_target_auth_token_fallback (line 660) | def test_detect_api_target_auth_token_fallback(self, monkeypatch): method test_main_delegates_to_api_when_key_set (line 671) | def test_main_delegates_to_api_when_key_set(self, monkeypatch, tmp_path): method test_main_uses_local_when_mode_local (line 693) | def test_main_uses_local_when_mode_local(self, monkeypatch, tmp_path): method test_main_uses_local_when_no_api_keys (line 719) | def test_main_uses_local_when_no_api_keys(self, monkeypatch, tmp_path): FILE: tests/test_epub_scraper.py function _make_sample_extracted_data (line 42) | def _make_sample_extracted_data( class TestEpubToSkillConverterInit (line 120) | class TestEpubToSkillConverterInit(unittest.TestCase): method setUp (line 123) | def setUp(self): method tearDown (line 128) | def tearDown(self): method test_init_with_name_and_epub_path (line 131) | def test_init_with_name_and_epub_path(self): method test_init_with_full_config (line 137) | def test_init_with_full_config(self): method test_default_description_uses_name (line 150) | def test_default_description_uses_name(self): method test_skill_dir_uses_name (line 156) | def test_skill_dir_uses_name(self): method test_data_file_uses_name (line 161) | def test_data_file_uses_name(self): method test_init_requires_name (line 166) | def test_init_requires_name(self): method test_init_empty_name (line 170) | def test_init_empty_name(self): method test_init_with_special_characters_in_name (line 175) | def test_init_with_special_characters_in_name(self): class TestEpubExtraction (line 187) | class TestEpubExtraction(unittest.TestCase): method setUp (line 190) | def setUp(self): method tearDown (line 197) | def tearDown(self): method _make_mock_book (line 200) | def _make_mock_book(self, spine_content=None, metadata=None, images=No... method test_extract_basic_epub (line 267) | def test_extract_basic_epub(self, mock_isfile, mock_exists, mock_epub): method test_extract_metadata (line 283) | def test_extract_metadata(self, mock_isfile, mock_exists, mock_epub): method test_extract_multiple_chapters (line 300) | def test_extract_multiple_chapters(self, mock_isfile, mock_exists, moc... method test_extract_code_blocks (line 319) | def test_extract_code_blocks(self, mock_isfile, mock_exists, mock_epub): method test_extract_images (line 343) | def test_extract_images(self, mock_isfile, mock_exists, mock_epub): method test_heading_boundary_splitting (line 358) | def test_heading_boundary_splitting(self, mock_isfile, mock_exists, mo... method test_extract_missing_file_raises_error (line 381) | def test_extract_missing_file_raises_error(self): method test_extract_invalid_extension_raises_error (line 387) | def test_extract_invalid_extension_raises_error(self): method test_extract_deps_not_installed (line 397) | def test_extract_deps_not_installed(self): method test_extract_empty_spine (line 409) | def test_extract_empty_spine(self, mock_isfile, mock_exists, mock_epub): method test_extract_spine_item_no_body (line 424) | def test_extract_spine_item_no_body(self, mock_isfile, mock_exists, mo... class TestEpubDrmDetection (line 445) | class TestEpubDrmDetection(unittest.TestCase): method setUp (line 448) | def setUp(self): method tearDown (line 453) | def tearDown(self): method _make_converter (line 456) | def _make_converter(self): method _make_book_with_encryption (line 460) | def _make_book_with_encryption(self, encryption_xml_content): method test_no_drm_detected (line 469) | def test_no_drm_detected(self): method test_drm_detected_adobe_adept (line 475) | def test_drm_detected_adobe_adept(self): method test_drm_detected_apple_fairplay (line 481) | def test_drm_detected_apple_fairplay(self): method test_drm_detected_readium_lcp (line 487) | def test_drm_detected_readium_lcp(self): method test_font_obfuscation_not_drm (line 493) | def test_font_obfuscation_not_drm(self): method test_drm_error_message_is_clear (line 503) | def test_drm_error_message_is_clear(self): class TestEpubCategorization (line 517) | class TestEpubCategorization(unittest.TestCase): method setUp (line 520) | def setUp(self): method tearDown (line 525) | def tearDown(self): method test_single_source_creates_one_category (line 528) | def test_single_source_creates_one_category(self): method test_keyword_categorization (line 537) | def test_keyword_categorization(self): method test_no_categories_uses_default (line 555) | def test_no_categories_uses_default(self): method test_categorize_empty_sections (line 564) | def test_categorize_empty_sections(self): method test_categorize_no_keyword_matches (line 573) | def test_categorize_no_keyword_matches(self): method test_categorize_single_section (line 585) | def test_categorize_single_section(self): method test_categorize_many_sections (line 594) | def test_categorize_many_sections(self): method test_categorize_preserves_section_order (line 603) | def test_categorize_preserves_section_order(self): class TestEpubSkillBuilding (line 619) | class TestEpubSkillBuilding(unittest.TestCase): method setUp (line 622) | def setUp(self): method tearDown (line 627) | def tearDown(self): method _make_converter (line 630) | def _make_converter(self, name="test_book", epub_path="test.epub"): method test_build_creates_directory_structure (line 637) | def test_build_creates_directory_structure(self): method test_build_generates_skill_md (line 649) | def test_build_generates_skill_md(self): method test_build_generates_reference_files (line 662) | def test_build_generates_reference_files(self): method test_build_generates_index (line 673) | def test_build_generates_index(self): method test_skill_md_contains_metadata (line 685) | def test_skill_md_contains_metadata(self): method test_skill_md_yaml_frontmatter (line 696) | def test_skill_md_yaml_frontmatter(self): method test_build_without_extracted_data_fails (line 715) | def test_build_without_extracted_data_fails(self): method test_build_overwrites_existing_output (line 721) | def test_build_overwrites_existing_output(self): method test_build_with_long_name (line 735) | def test_build_with_long_name(self): method test_build_with_unicode_content (line 752) | def test_build_with_unicode_content(self): class TestEpubCodeBlocks (line 784) | class TestEpubCodeBlocks(unittest.TestCase): method setUp (line 787) | def setUp(self): method tearDown (line 792) | def tearDown(self): method _make_converter (line 795) | def _make_converter(self): method test_code_blocks_included_in_reference_files (line 802) | def test_code_blocks_included_in_reference_files(self): method test_code_blocks_in_skill_md_top_15 (line 819) | def test_code_blocks_in_skill_md_top_15(self): method test_code_language_grouped (line 829) | def test_code_language_grouped(self): method test_empty_code_block (line 840) | def test_empty_code_block(self): method test_code_block_with_html_entities (line 849) | def test_code_block_with_html_entities(self): method test_code_block_with_syntax_highlighting_spans (line 862) | def test_code_block_with_syntax_highlighting_spans(self): method test_code_block_language_from_class (line 878) | def test_code_block_language_from_class(self): method test_code_quality_scoring (line 887) | def test_code_quality_scoring(self): class TestEpubTables (line 913) | class TestEpubTables(unittest.TestCase): method setUp (line 916) | def setUp(self): method tearDown (line 921) | def tearDown(self): method test_tables_in_reference_files (line 924) | def test_tables_in_reference_files(self): method test_table_with_headers (line 944) | def test_table_with_headers(self): method test_table_no_thead (line 958) | def test_table_no_thead(self): method test_empty_table (line 972) | def test_empty_table(self): method test_table_with_colspan_rowspan (line 981) | def test_table_with_colspan_rowspan(self): class TestEpubImages (line 1001) | class TestEpubImages(unittest.TestCase): method setUp (line 1004) | def setUp(self): method tearDown (line 1009) | def tearDown(self): method test_images_saved_to_assets (line 1012) | def test_images_saved_to_assets(self): method test_image_references_in_markdown (line 1025) | def test_image_references_in_markdown(self): method test_image_with_zero_bytes (line 1046) | def test_image_with_zero_bytes(self): method test_svg_images_handled (line 1059) | def test_svg_images_handled(self): method test_image_filename_conflicts (line 1068) | def test_image_filename_conflicts(self): method test_cover_image_identified (line 1087) | def test_cover_image_identified(self): method test_many_images (line 1096) | def test_many_images(self): class TestEpubErrorHandling (line 1117) | class TestEpubErrorHandling(unittest.TestCase): method setUp (line 1120) | def setUp(self): method tearDown (line 1127) | def tearDown(self): method test_missing_epub_file_raises_error (line 1130) | def test_missing_epub_file_raises_error(self): method test_not_a_file_raises_error (line 1136) | def test_not_a_file_raises_error(self): method test_not_epub_extension_raises_error (line 1142) | def test_not_epub_extension_raises_error(self): method test_corrupted_epub_raises_error (line 1153) | def test_corrupted_epub_raises_error(self, mock_isfile, mock_exists, m... method test_drm_protected_raises_error (line 1163) | def test_drm_protected_raises_error(self, mock_isfile, mock_exists, mo... method test_ebooklib_not_installed_error (line 1180) | def test_ebooklib_not_installed_error(self): method test_malformed_xhtml_handled_gracefully (line 1192) | def test_malformed_xhtml_handled_gracefully(self, mock_isfile, mock_ex... class TestEpubJSONWorkflow (line 1219) | class TestEpubJSONWorkflow(unittest.TestCase): method setUp (line 1222) | def setUp(self): method tearDown (line 1227) | def tearDown(self): method test_load_extracted_json (line 1230) | def test_load_extracted_json(self): method test_build_from_json (line 1244) | def test_build_from_json(self): method test_json_round_trip (line 1261) | def test_json_round_trip(self): method test_load_invalid_json (line 1286) | def test_load_invalid_json(self): method test_load_nonexistent_json (line 1296) | def test_load_nonexistent_json(self): method test_json_with_missing_fields (line 1303) | def test_json_with_missing_fields(self): class TestEpubCLIArguments (line 1339) | class TestEpubCLIArguments(unittest.TestCase): method setUp (line 1342) | def setUp(self): method _parse_args (line 1346) | def _parse_args(self, args_list): method test_epub_flag_accepted (line 1355) | def test_epub_flag_accepted(self): method test_from_json_flag_accepted (line 1359) | def test_from_json_flag_accepted(self): method test_name_flag_accepted (line 1363) | def test_name_flag_accepted(self): method test_enhance_level_default_zero (line 1367) | def test_enhance_level_default_zero(self): method test_dry_run_flag (line 1371) | def test_dry_run_flag(self): method test_no_args_accepted (line 1375) | def test_no_args_accepted(self): method test_verbose_flag (line 1380) | def test_verbose_flag(self): method test_quiet_flag (line 1384) | def test_quiet_flag(self): class TestEpubHelperFunctions (line 1394) | class TestEpubHelperFunctions(unittest.TestCase): method setUp (line 1397) | def setUp(self): method test_infer_description_from_metadata_description (line 1401) | def test_infer_description_from_metadata_description(self): method test_infer_description_from_metadata_title (line 1407) | def test_infer_description_from_metadata_title(self): method test_infer_description_fallback (line 1412) | def test_infer_description_fallback(self): method test_infer_description_empty_metadata (line 1416) | def test_infer_description_empty_metadata(self): method test_score_code_quality_ranges (line 1420) | def test_score_code_quality_ranges(self): method test_sanitize_filename (line 1432) | def test_sanitize_filename(self): class TestEpubSourceDetection (line 1447) | class TestEpubSourceDetection(unittest.TestCase): method setUp (line 1450) | def setUp(self): method tearDown (line 1459) | def tearDown(self): method test_epub_detected_as_epub_type (line 1462) | def test_epub_detected_as_epub_type(self): method test_epub_suggested_name (line 1466) | def test_epub_suggested_name(self): method test_epub_validation_missing_file (line 1470) | def test_epub_validation_missing_file(self): method test_epub_validation_not_a_file (line 1475) | def test_epub_validation_not_a_file(self): method test_epub_with_path (line 1484) | def test_epub_with_path(self): method test_pdf_still_detected (line 1489) | def test_pdf_still_detected(self): class TestEpubEdgeCases (line 1500) | class TestEpubEdgeCases(unittest.TestCase): method setUp (line 1503) | def setUp(self): method tearDown (line 1508) | def tearDown(self): method test_epub_no_toc (line 1511) | def test_epub_no_toc(self): method test_epub_empty_chapters (line 1523) | def test_epub_empty_chapters(self): method test_epub_single_chapter (line 1530) | def test_epub_single_chapter(self): method test_epub_unicode_content (line 1545) | def test_epub_unicode_content(self): method test_epub_large_section_count (line 1556) | def test_epub_large_section_count(self): method test_epub_nested_headings (line 1569) | def test_epub_nested_headings(self): method test_fixed_layout_detected (line 1589) | def test_fixed_layout_detected(self): method test_epub2_vs_epub3 (line 1608) | def test_epub2_vs_epub3(self): FILE: tests/test_estimate_pages.py class TestEstimatePages (line 13) | class TestEstimatePages(unittest.TestCase): method test_estimate_pages_with_minimal_config (line 16) | def test_estimate_pages_with_minimal_config(self): method test_estimate_pages_returns_discovered_count (line 31) | def test_estimate_pages_returns_discovered_count(self): method test_estimate_pages_respects_max_discovery (line 40) | def test_estimate_pages_respects_max_discovery(self): method test_estimate_pages_with_start_urls (line 49) | def test_estimate_pages_with_start_urls(self): class TestEstimatePagesCLI (line 64) | class TestEstimatePagesCLI(unittest.TestCase): method test_cli_help_output (line 67) | def test_cli_help_output(self): method test_cli_executes_with_help_flag (line 83) | def test_cli_executes_with_help_flag(self): method test_cli_requires_config_argument (line 97) | def test_cli_requires_config_argument(self): method test_cli_all_flag_lists_configs (line 116) | def test_cli_all_flag_lists_configs(self): method test_cli_all_flag_with_direct_entry_point (line 146) | def test_cli_all_flag_with_direct_entry_point(self): class TestEstimatePagesWithRealConfig (line 165) | class TestEstimatePagesWithRealConfig(unittest.TestCase): method test_estimate_with_real_config_file (line 168) | def test_estimate_with_real_config_file(self): FILE: tests/test_excluded_dirs_config.py class TestExcludedDirsDefaults (line 12) | class TestExcludedDirsDefaults(unittest.TestCase): method test_defaults_when_no_config (line 16) | def test_defaults_when_no_config(self, _mock_github): method test_defaults_exclude_common_dirs (line 26) | def test_defaults_exclude_common_dirs(self, _mock_github): method test_dot_directories_always_excluded (line 45) | def test_dot_directories_always_excluded(self, _mock_github): class TestExcludedDirsAdditional (line 57) | class TestExcludedDirsAdditional(unittest.TestCase): method test_extend_with_additional_dirs (line 61) | def test_extend_with_additional_dirs(self, _mock_github): method test_extend_excludes_additional_dirs (line 81) | def test_extend_excludes_additional_dirs(self, _mock_github): method test_extend_with_empty_list (line 99) | def test_extend_with_empty_list(self, _mock_github): class TestExcludedDirsReplace (line 109) | class TestExcludedDirsReplace(unittest.TestCase): method test_replace_with_custom_list (line 113) | def test_replace_with_custom_list(self, _mock_github): method test_replace_excludes_only_specified_dirs (line 124) | def test_replace_excludes_only_specified_dirs(self, _mock_github): method test_replace_with_empty_list (line 144) | def test_replace_with_empty_list(self, _mock_github): class TestExcludedDirsPrecedence (line 163) | class TestExcludedDirsPrecedence(unittest.TestCase): method test_replace_takes_precedence_over_additional (line 167) | def test_replace_takes_precedence_over_additional(self, _mock_github): class TestExcludedDirsEdgeCases (line 183) | class TestExcludedDirsEdgeCases(unittest.TestCase): method test_duplicate_exclusions_in_additional (line 187) | def test_duplicate_exclusions_in_additional(self, _mock_github): method test_case_sensitive_exclusions (line 210) | def test_case_sensitive_exclusions(self, _mock_github): class TestExcludedDirsWithLocalRepo (line 223) | class TestExcludedDirsWithLocalRepo(unittest.TestCase): method test_exclude_dirs_with_local_repo_path (line 227) | def test_exclude_dirs_with_local_repo_path(self, _mock_github): method test_replace_mode_with_local_repo_path (line 248) | def test_replace_mode_with_local_repo_path(self, _mock_github): class TestExcludedDirsLogging (line 264) | class TestExcludedDirsLogging(unittest.TestCase): method test_extend_mode_logs_info (line 269) | def test_extend_mode_logs_info(self, mock_logger, _mock_github): method test_replace_mode_logs_warning (line 282) | def test_replace_mode_logs_warning(self, mock_logger, _mock_github): method test_no_config_no_logging (line 299) | def test_no_config_no_logging(self, mock_logger, _mock_github): class TestExcludedDirsTypeHandling (line 317) | class TestExcludedDirsTypeHandling(unittest.TestCase): method test_exclude_dirs_with_tuple (line 321) | def test_exclude_dirs_with_tuple(self, _mock_github): method test_exclude_dirs_additional_with_set (line 334) | def test_exclude_dirs_additional_with_set(self, _mock_github): FILE: tests/test_framework_detection.py class TestFrameworkDetection (line 16) | class TestFrameworkDetection(unittest.TestCase): method setUp (line 19) | def setUp(self): method tearDown (line 26) | def tearDown(self): method test_flask_framework_detection_from_imports (line 31) | def test_flask_framework_detection_from_imports(self): method test_files_with_imports_are_included (line 87) | def test_files_with_imports_are_included(self): method test_no_false_positive_frameworks (line 137) | def test_no_false_positive_frameworks(self): FILE: tests/test_generate_router_github.py class TestRouterGeneratorBasic (line 17) | class TestRouterGeneratorBasic: method test_router_generator_init (line 20) | def test_router_generator_init(self, tmp_path): method test_infer_router_name (line 51) | def test_infer_router_name(self, tmp_path): method test_extract_routing_keywords_basic (line 68) | def test_extract_routing_keywords_basic(self, tmp_path): class TestRouterGeneratorWithGitHub (line 90) | class TestRouterGeneratorWithGitHub: method test_router_with_github_metadata (line 93) | def test_router_with_github_metadata(self, tmp_path): method test_extract_keywords_with_github_labels (line 141) | def test_extract_keywords_with_github_labels(self, tmp_path): method test_generate_skill_md_with_github (line 176) | def test_generate_skill_md_with_github(self, tmp_path): method test_generate_skill_md_without_github (line 244) | def test_generate_skill_md_without_github(self, tmp_path): class TestSubSkillIssuesSection (line 272) | class TestSubSkillIssuesSection: method test_generate_subskill_issues_section (line 275) | def test_generate_subskill_issues_section(self, tmp_path): method test_generate_subskill_issues_no_matches (line 334) | def test_generate_subskill_issues_no_matches(self, tmp_path): class TestIntegration (line 376) | class TestIntegration: method test_full_router_generation_with_github (line 379) | def test_full_router_generation_with_github(self, tmp_path): FILE: tests/test_git_repo.py function temp_cache_dir (line 17) | def temp_cache_dir(tmp_path): function git_repo (line 25) | def git_repo(temp_cache_dir): class TestGitConfigRepoInit (line 30) | class TestGitConfigRepoInit: method test_init_with_custom_cache_dir (line 33) | def test_init_with_custom_cache_dir(self, temp_cache_dir): method test_init_with_env_var (line 39) | def test_init_with_env_var(self, tmp_path, monkeypatch): method test_init_with_default (line 48) | def test_init_with_default(self, monkeypatch): class TestValidateGitUrl (line 57) | class TestValidateGitUrl: method test_validate_https_url (line 60) | def test_validate_https_url(self): method test_validate_http_url (line 65) | def test_validate_http_url(self): method test_validate_ssh_url (line 69) | def test_validate_ssh_url(self): method test_validate_file_url (line 74) | def test_validate_file_url(self): method test_invalid_empty_url (line 78) | def test_invalid_empty_url(self): method test_invalid_malformed_url (line 83) | def test_invalid_malformed_url(self): method test_invalid_ssh_without_colon (line 88) | def test_invalid_ssh_without_colon(self): class TestInjectToken (line 93) | class TestInjectToken: method test_inject_token_https (line 96) | def test_inject_token_https(self): method test_inject_token_ssh_to_https (line 104) | def test_inject_token_ssh_to_https(self): method test_inject_token_with_port (line 112) | def test_inject_token_with_port(self): method test_inject_token_gitlab_ssh (line 120) | def test_inject_token_gitlab_ssh(self): class TestCloneOrPull (line 129) | class TestCloneOrPull: method test_clone_new_repo (line 133) | def test_clone_new_repo(self, mock_clone, git_repo): method test_pull_existing_repo (line 151) | def test_pull_existing_repo(self, mock_repo_class, git_repo, temp_cach... method test_pull_with_token_update (line 172) | def test_pull_with_token_update(self, mock_repo_class, git_repo, temp_... method test_force_refresh_deletes_cache (line 197) | def test_force_refresh_deletes_cache(self, mock_clone, git_repo, temp_... method test_clone_with_custom_branch (line 215) | def test_clone_with_custom_branch(self, mock_clone, git_repo): method test_clone_invalid_url_raises_error (line 226) | def test_clone_invalid_url_raises_error(self, git_repo): method test_clone_auth_failure_error (line 232) | def test_clone_auth_failure_error(self, mock_clone, git_repo): method test_clone_not_found_error (line 244) | def test_clone_not_found_error(self, mock_clone, git_repo): class TestFindConfigs (line 254) | class TestFindConfigs: method test_find_configs_in_root (line 257) | def test_find_configs_in_root(self, git_repo, temp_cache_dir): method test_find_configs_in_subdirs (line 272) | def test_find_configs_in_subdirs(self, git_repo, temp_cache_dir): method test_find_configs_excludes_git_dir (line 286) | def test_find_configs_excludes_git_dir(self, git_repo, temp_cache_dir): method test_find_configs_empty_repo (line 300) | def test_find_configs_empty_repo(self, git_repo, temp_cache_dir): method test_find_configs_nonexistent_repo (line 309) | def test_find_configs_nonexistent_repo(self, git_repo, temp_cache_dir): method test_find_configs_sorted_by_name (line 317) | def test_find_configs_sorted_by_name(self, git_repo, temp_cache_dir): class TestGetConfig (line 331) | class TestGetConfig: method test_get_config_exact_match (line 334) | def test_get_config_exact_match(self, git_repo, temp_cache_dir): method test_get_config_with_json_extension (line 346) | def test_get_config_with_json_extension(self, git_repo, temp_cache_dir): method test_get_config_case_insensitive (line 358) | def test_get_config_case_insensitive(self, git_repo, temp_cache_dir): method test_get_config_in_subdir (line 370) | def test_get_config_in_subdir(self, git_repo, temp_cache_dir): method test_get_config_not_found (line 383) | def test_get_config_not_found(self, git_repo, temp_cache_dir): method test_get_config_not_found_shows_available (line 393) | def test_get_config_not_found_shows_available(self, git_repo, temp_cac... method test_get_config_invalid_json (line 404) | def test_get_config_invalid_json(self, git_repo, temp_cache_dir): FILE: tests/test_git_sources_e2e.py class TestGitSourcesE2E (line 37) | class TestGitSourcesE2E: method temp_dirs (line 41) | def temp_dirs(self): method temp_git_repo (line 51) | def temp_git_repo(self): method test_e2e_workflow_direct_git_url (line 107) | def test_e2e_workflow_direct_git_url(self, temp_dirs, temp_git_repo): method test_e2e_workflow_with_source_registration (line 150) | def test_e2e_workflow_with_source_registration(self, temp_dirs, temp_g... method test_e2e_multiple_sources_priority_resolution (line 225) | def test_e2e_multiple_sources_priority_resolution(self, temp_dirs, tem... method test_e2e_pull_existing_repository (line 262) | def test_e2e_pull_existing_repository(self, temp_dirs, temp_git_repo): method test_e2e_force_refresh (line 321) | def test_e2e_force_refresh(self, temp_dirs, temp_git_repo): method test_e2e_config_not_found (line 362) | def test_e2e_config_not_found(self, temp_dirs, temp_git_repo): method test_e2e_invalid_git_url (line 394) | def test_e2e_invalid_git_url(self, temp_dirs): method test_e2e_source_name_validation (line 414) | def test_e2e_source_name_validation(self, temp_dirs): method test_e2e_registry_persistence (line 444) | def test_e2e_registry_persistence(self, temp_dirs, temp_git_repo): method test_e2e_cache_isolation (line 485) | def test_e2e_cache_isolation(self, temp_dirs, temp_git_repo): method test_e2e_auto_detect_token_env (line 539) | def test_e2e_auto_detect_token_env(self, temp_dirs): method test_e2e_complete_user_workflow (line 580) | def test_e2e_complete_user_workflow(self, temp_dirs, temp_git_repo): class TestMCPToolsE2E (line 662) | class TestMCPToolsE2E: method temp_dirs (line 666) | def temp_dirs(self): method temp_git_repo (line 684) | def temp_git_repo(self): method test_mcp_add_list_remove_source_e2e (line 715) | async def test_mcp_add_list_remove_source_e2e(self, temp_dirs, temp_gi... method test_mcp_fetch_config_git_url_mode_e2e (line 757) | async def test_mcp_fetch_config_git_url_mode_e2e(self, temp_dirs, temp... method test_mcp_fetch_config_source_mode_e2e (line 794) | async def test_mcp_fetch_config_source_mode_e2e(self, temp_dirs, temp_... method test_mcp_error_handling_e2e (line 826) | async def test_mcp_error_handling_e2e(self, temp_dirs, temp_git_repo): FILE: tests/test_github_fetcher.py class TestDataClasses (line 24) | class TestDataClasses: method test_code_stream (line 27) | def test_code_stream(self): method test_docs_stream (line 33) | def test_docs_stream(self): method test_insights_stream (line 44) | def test_insights_stream(self): method test_three_stream_data (line 57) | def test_three_stream_data(self): class TestGitHubFetcherInit (line 69) | class TestGitHubFetcherInit: method test_parse_https_url (line 72) | def test_parse_https_url(self): method test_parse_https_url_with_git (line 78) | def test_parse_https_url_with_git(self): method test_parse_git_url (line 84) | def test_parse_git_url(self): method test_invalid_url (line 90) | def test_invalid_url(self): method test_github_token_from_env (line 96) | def test_github_token_from_env(self): class TestFileClassification (line 102) | class TestFileClassification: method test_classify_files (line 105) | def test_classify_files(self, tmp_path): method test_classify_excludes_hidden_files (line 135) | def test_classify_excludes_hidden_files(self, tmp_path): method test_classify_various_code_extensions (line 147) | def test_classify_various_code_extensions(self, tmp_path): class TestIssueAnalysis (line 160) | class TestIssueAnalysis: method test_analyze_issues_common_problems (line 163) | def test_analyze_issues_common_problems(self): method test_analyze_issues_known_solutions (line 189) | def test_analyze_issues_known_solutions(self): method test_analyze_issues_top_labels (line 214) | def test_analyze_issues_top_labels(self): method test_analyze_issues_limits_to_10 (line 229) | def test_analyze_issues_limits_to_10(self): class TestGitHubAPI (line 254) | class TestGitHubAPI: method test_fetch_github_metadata (line 258) | def test_fetch_github_metadata(self, mock_get): method test_fetch_github_metadata_failure (line 282) | def test_fetch_github_metadata_failure(self, mock_get): method test_fetch_issues (line 294) | def test_fetch_issues(self, mock_get): method test_fetch_issues_filters_pull_requests (line 317) | def test_fetch_issues_filters_pull_requests(self, mock_get): class TestReadFile (line 341) | class TestReadFile: method test_read_file_success (line 344) | def test_read_file_success(self, tmp_path): method test_read_file_not_found (line 354) | def test_read_file_not_found(self, tmp_path): method test_read_file_encoding_fallback (line 361) | def test_read_file_encoding_fallback(self, tmp_path): class TestIntegration (line 374) | class TestIntegration: method test_fetch_integration (line 379) | def test_fetch_integration(self, mock_get, mock_run, tmp_path): FILE: tests/test_github_scraper.py class TestGitHubScraperInitialization (line 34) | class TestGitHubScraperInitialization(unittest.TestCase): method setUp (line 37) | def setUp(self): method tearDown (line 48) | def tearDown(self): method test_init_with_repo_name (line 53) | def test_init_with_repo_name(self): method test_init_with_token_from_config (line 63) | def test_init_with_token_from_config(self): method test_init_with_token_from_env (line 75) | def test_init_with_token_from_env(self): method test_init_without_token (line 86) | def test_init_without_token(self): method test_token_priority_env_over_config (line 98) | def test_token_priority_env_over_config(self): class TestREADMEExtraction (line 112) | class TestREADMEExtraction(unittest.TestCase): method setUp (line 115) | def setUp(self): method test_extract_readme_success (line 122) | def test_extract_readme_success(self): method test_extract_readme_tries_multiple_locations (line 139) | def test_extract_readme_tries_multiple_locations(self): method test_extract_readme_not_found (line 162) | def test_extract_readme_not_found(self): class TestLanguageDetection (line 177) | class TestLanguageDetection(unittest.TestCase): method setUp (line 180) | def setUp(self): method test_extract_languages_success (line 187) | def test_extract_languages_success(self): method test_extract_languages_empty (line 214) | def test_extract_languages_empty(self): class TestIssuesExtraction (line 229) | class TestIssuesExtraction(unittest.TestCase): method setUp (line 232) | def setUp(self): method test_extract_issues_success (line 239) | def test_extract_issues_success(self): method test_extract_issues_filters_pull_requests (line 309) | def test_extract_issues_filters_pull_requests(self): method test_extract_issues_respects_max_limit (line 349) | def test_extract_issues_respects_max_limit(self): class TestChangelogExtraction (line 387) | class TestChangelogExtraction(unittest.TestCase): method setUp (line 390) | def setUp(self): method test_extract_changelog_success (line 397) | def test_extract_changelog_success(self): method test_extract_changelog_tries_multiple_locations (line 414) | def test_extract_changelog_tries_multiple_locations(self): method test_extract_changelog_not_found (line 440) | def test_extract_changelog_not_found(self): class TestReleasesExtraction (line 455) | class TestReleasesExtraction(unittest.TestCase): method setUp (line 458) | def setUp(self): method test_extract_releases_success (line 465) | def test_extract_releases_success(self): method test_extract_releases_empty (line 516) | def test_extract_releases_empty(self): class TestGitHubToSkillConverter (line 531) | class TestGitHubToSkillConverter(unittest.TestCase): method setUp (line 534) | def setUp(self): method tearDown (line 591) | def tearDown(self): method test_init_loads_data (line 596) | def test_init_loads_data(self): method test_build_skill_creates_directory_structure (line 610) | def test_build_skill_creates_directory_structure(self): class TestSymlinkHandling (line 636) | class TestSymlinkHandling(unittest.TestCase): method setUp (line 639) | def setUp(self): method test_get_file_content_regular_file (line 646) | def test_get_file_content_regular_file(self): method test_get_file_content_symlink (line 666) | def test_get_file_content_symlink(self): method test_get_file_content_broken_symlink (line 697) | def test_get_file_content_broken_symlink(self): method test_get_file_content_symlink_no_target (line 722) | def test_get_file_content_symlink_no_target(self): method test_extract_readme_with_symlink (line 742) | def test_extract_readme_with_symlink(self): method test_extract_changelog_with_symlink (line 772) | def test_extract_changelog_with_symlink(self): method test_get_file_content_encoding_error (line 799) | def test_get_file_content_encoding_error(self): method test_get_file_content_large_file (line 821) | def test_get_file_content_large_file(self): method test_extract_changelog_large_file (line 855) | def test_extract_changelog_large_file(self): class TestGitignoreSupport (line 887) | class TestGitignoreSupport(unittest.TestCase): method setUp (line 890) | def setUp(self): method tearDown (line 901) | def tearDown(self): method test_load_gitignore_exists (line 905) | def test_load_gitignore_exists(self): method test_load_gitignore_missing (line 924) | def test_load_gitignore_missing(self): method test_should_exclude_dir_with_gitignore (line 934) | def test_should_exclude_dir_with_gitignore(self): method test_should_exclude_dir_default_exclusions (line 953) | def test_should_exclude_dir_default_exclusions(self): class TestErrorHandling (line 970) | class TestErrorHandling(unittest.TestCase): method setUp (line 973) | def setUp(self): method test_invalid_repo_name (line 980) | def test_invalid_repo_name(self): method test_rate_limit_error (line 995) | def test_rate_limit_error(self): FILE: tests/test_guide_enhancer.py class TestGuideEnhancerModeDetection (line 26) | class TestGuideEnhancerModeDetection: method test_auto_mode_with_api_key (line 29) | def test_auto_mode_with_api_key(self): method test_auto_mode_without_api_key (line 41) | def test_auto_mode_without_api_key(self): method test_explicit_api_mode (line 50) | def test_explicit_api_mode(self): method test_explicit_local_mode (line 55) | def test_explicit_local_mode(self): method test_explicit_none_mode (line 60) | def test_explicit_none_mode(self): method test_claude_cli_check (line 65) | def test_claude_cli_check(self): class TestGuideEnhancerStepDescriptions (line 72) | class TestGuideEnhancerStepDescriptions: method test_enhance_step_descriptions_empty_list (line 75) | def test_enhance_step_descriptions_empty_list(self): method test_enhance_step_descriptions_none_mode (line 82) | def test_enhance_step_descriptions_none_mode(self): method test_enhance_step_descriptions_api_mode (line 95) | def test_enhance_step_descriptions_api_mode(self, mock_call): method test_enhance_step_descriptions_malformed_json (line 135) | def test_enhance_step_descriptions_malformed_json(self): class TestGuideEnhancerTroubleshooting (line 145) | class TestGuideEnhancerTroubleshooting: method test_enhance_troubleshooting_none_mode (line 148) | def test_enhance_troubleshooting_none_mode(self): method test_enhance_troubleshooting_api_mode (line 160) | def test_enhance_troubleshooting_api_mode(self, mock_call): class TestGuideEnhancerPrerequisites (line 202) | class TestGuideEnhancerPrerequisites: method test_enhance_prerequisites_empty_list (line 205) | def test_enhance_prerequisites_empty_list(self): method test_enhance_prerequisites_none_mode (line 211) | def test_enhance_prerequisites_none_mode(self): method test_enhance_prerequisites_api_mode (line 219) | def test_enhance_prerequisites_api_mode(self, mock_call): class TestGuideEnhancerNextSteps (line 260) | class TestGuideEnhancerNextSteps: method test_enhance_next_steps_none_mode (line 263) | def test_enhance_next_steps_none_mode(self): method test_enhance_next_steps_api_mode (line 271) | def test_enhance_next_steps_api_mode(self, mock_call): class TestGuideEnhancerUseCases (line 306) | class TestGuideEnhancerUseCases: method test_enhance_use_cases_none_mode (line 309) | def test_enhance_use_cases_none_mode(self): method test_enhance_use_cases_api_mode (line 317) | def test_enhance_use_cases_api_mode(self, mock_call): class TestGuideEnhancerFullWorkflow (line 351) | class TestGuideEnhancerFullWorkflow: method test_enhance_guide_none_mode (line 354) | def test_enhance_guide_none_mode(self): method test_enhance_guide_api_mode_success (line 376) | def test_enhance_guide_api_mode_success(self, mock_call): method test_enhance_guide_error_fallback (line 444) | def test_enhance_guide_error_fallback(self): class TestGuideEnhancerLocalMode (line 467) | class TestGuideEnhancerLocalMode: method test_call_claude_local_success (line 471) | def test_call_claude_local_success(self, mock_run): method test_call_claude_local_timeout (line 495) | def test_call_claude_local_timeout(self, mock_run): class TestGuideEnhancerPromptGeneration (line 509) | class TestGuideEnhancerPromptGeneration: method test_create_enhancement_prompt (line 512) | def test_create_enhancement_prompt(self): method test_format_steps_for_prompt (line 534) | def test_format_steps_for_prompt(self): method test_format_steps_empty (line 550) | def test_format_steps_empty(self): class TestGuideEnhancerResponseParsing (line 557) | class TestGuideEnhancerResponseParsing: method test_parse_enhancement_response_valid_json (line 560) | def test_parse_enhancement_response_valid_json(self): method test_parse_enhancement_response_with_extra_text (line 585) | def test_parse_enhancement_response_with_extra_text(self): method test_parse_enhancement_response_invalid_json (line 605) | def test_parse_enhancement_response_invalid_json(self): FILE: tests/test_how_to_guide_builder.py class TestWorkflowAnalyzer (line 36) | class TestWorkflowAnalyzer(unittest.TestCase): method setUp (line 39) | def setUp(self): method test_analyze_python_workflow (line 42) | def test_analyze_python_workflow(self): method test_detect_prerequisites (line 77) | def test_detect_prerequisites(self): method test_find_verification_points (line 105) | def test_find_verification_points(self): method test_calculate_complexity (line 121) | def test_calculate_complexity(self): method test_extract_steps_python_ast (line 143) | def test_extract_steps_python_ast(self): method test_extract_steps_heuristic (line 172) | def test_extract_steps_heuristic(self): class TestWorkflowGrouper (line 204) | class TestWorkflowGrouper(unittest.TestCase): method setUp (line 207) | def setUp(self): method test_group_by_file_path (line 210) | def test_group_by_file_path(self): method test_group_by_test_name (line 240) | def test_group_by_test_name(self): method test_group_by_complexity (line 253) | def test_group_by_complexity(self): method test_group_by_ai_tutorial_group (line 275) | def test_group_by_ai_tutorial_group(self): class TestGuideGenerator (line 300) | class TestGuideGenerator(unittest.TestCase): method setUp (line 303) | def setUp(self): method test_generate_guide_markdown (line 306) | def test_generate_guide_markdown(self): method test_create_header (line 334) | def test_create_header(self): method test_create_steps_section (line 351) | def test_create_steps_section(self): method test_create_complete_example (line 373) | def test_create_complete_example(self): method test_create_index (line 389) | def test_create_index(self): class TestHowToGuideBuilder (line 416) | class TestHowToGuideBuilder(unittest.TestCase): method setUp (line 419) | def setUp(self): method tearDown (line 423) | def tearDown(self): method test_extract_workflow_examples (line 427) | def test_extract_workflow_examples(self): method test_create_guide_from_workflows (line 452) | def test_create_guide_from_workflows(self): method test_create_collection (line 471) | def test_create_collection(self): method test_save_guides_to_files (line 490) | def test_save_guides_to_files(self): method test_build_guides_from_examples (line 524) | def test_build_guides_from_examples(self): class TestEndToEnd (line 556) | class TestEndToEnd(unittest.TestCase): method setUp (line 559) | def setUp(self): method tearDown (line 562) | def tearDown(self): method test_full_workflow (line 566) | def test_full_workflow(self): class TestAIEnhancementIntegration (line 643) | class TestAIEnhancementIntegration(unittest.TestCase): method setUp (line 646) | def setUp(self): method tearDown (line 649) | def tearDown(self): method test_build_with_ai_enhancement_disabled (line 653) | def test_build_with_ai_enhancement_disabled(self): method test_build_with_ai_enhancement_api_mode_mocked (line 698) | def test_build_with_ai_enhancement_api_mode_mocked(self): method test_build_with_ai_enhancement_local_mode_mocked (line 764) | def test_build_with_ai_enhancement_local_mode_mocked(self): method test_build_with_ai_enhancement_auto_mode (line 827) | def test_build_with_ai_enhancement_auto_mode(self): method test_graceful_fallback_when_ai_fails (line 889) | def test_graceful_fallback_when_ai_fails(self): class TestExpandedWorkflowDetection (line 938) | class TestExpandedWorkflowDetection(unittest.TestCase): method setUp (line 941) | def setUp(self): method test_empty_examples_returns_empty_collection (line 944) | def test_empty_examples_returns_empty_collection(self): method test_non_workflow_examples_returns_empty_collection (line 951) | def test_non_workflow_examples_returns_empty_collection(self): method test_workflow_example_detected (line 961) | def test_workflow_example_detected(self): method test_guide_collection_always_valid (line 977) | def test_guide_collection_always_valid(self): method test_heuristic_detection_4_assignments_3_calls (line 991) | def test_heuristic_detection_4_assignments_3_calls(self): method test_new_workflow_keywords_detection (line 1024) | def test_new_workflow_keywords_detection(self): method test_heuristic_does_not_match_simple_tests (line 1067) | def test_heuristic_does_not_match_simple_tests(self): method test_keyword_case_insensitive_matching (line 1093) | def test_keyword_case_insensitive_matching(self): FILE: tests/test_incremental_updates.py function temp_skill_dir (line 27) | def temp_skill_dir(): function test_initial_scan_all_added (line 47) | def test_initial_scan_all_added(temp_skill_dir): function test_no_changes_after_save (line 61) | def test_no_changes_after_save(temp_skill_dir): function test_detect_modified_file (line 80) | def test_detect_modified_file(temp_skill_dir): function test_detect_added_file (line 104) | def test_detect_added_file(temp_skill_dir): function test_detect_deleted_file (line 127) | def test_detect_deleted_file(temp_skill_dir): function test_mixed_changes (line 149) | def test_mixed_changes(temp_skill_dir): function test_generate_update_package (line 180) | def test_generate_update_package(temp_skill_dir): function test_diff_report_generation (line 212) | def test_diff_report_generation(temp_skill_dir): function test_version_increment (line 234) | def test_version_increment(temp_skill_dir): function test_apply_update_package (line 266) | def test_apply_update_package(temp_skill_dir): function test_content_hash_consistency (line 304) | def test_content_hash_consistency(temp_skill_dir): function test_empty_skill_directory (line 322) | def test_empty_skill_directory(): FILE: tests/test_install_agent.py class TestAgentPathMapping (line 35) | class TestAgentPathMapping: method test_get_agent_path_home_expansion (line 38) | def test_get_agent_path_home_expansion(self): method test_get_agent_path_project_relative (line 46) | def test_get_agent_path_project_relative(self): method test_get_agent_path_project_relative_with_custom_root (line 55) | def test_get_agent_path_project_relative_with_custom_root(self): method test_get_agent_path_invalid_agent (line 63) | def test_get_agent_path_invalid_agent(self): method test_get_available_agents (line 68) | def test_get_available_agents(self): method test_agent_path_case_insensitive (line 80) | def test_agent_path_case_insensitive(self): class TestAgentNameValidation (line 88) | class TestAgentNameValidation: method test_validate_valid_agent (line 91) | def test_validate_valid_agent(self): method test_validate_invalid_agent_suggests_similar (line 97) | def test_validate_invalid_agent_suggests_similar(self): method test_validate_special_all (line 103) | def test_validate_special_all(self): method test_validate_case_insensitive (line 109) | def test_validate_case_insensitive(self): method test_validate_shows_available_agents (line 116) | def test_validate_shows_available_agents(self): class TestSkillDirectoryValidation (line 125) | class TestSkillDirectoryValidation: method test_validate_valid_skill_directory (line 128) | def test_validate_valid_skill_directory(self): method test_validate_missing_directory (line 139) | def test_validate_missing_directory(self): method test_validate_not_a_directory (line 146) | def test_validate_not_a_directory(self): method test_validate_missing_skill_md (line 156) | def test_validate_missing_skill_md(self): class TestInstallToAgent (line 167) | class TestInstallToAgent: method setup_method (line 170) | def setup_method(self): method teardown_method (line 189) | def teardown_method(self): method test_install_creates_skill_subdirectory (line 193) | def test_install_creates_skill_subdirectory(self): method test_install_preserves_structure (line 209) | def test_install_preserves_structure(self): method test_install_excludes_backups (line 231) | def test_install_excludes_backups(self): method test_install_existing_directory_no_force (line 253) | def test_install_existing_directory_no_force(self): method test_install_existing_directory_with_force (line 270) | def test_install_existing_directory_with_force(self): method test_install_invalid_skill_directory (line 290) | def test_install_invalid_skill_directory(self): method test_install_missing_skill_md (line 299) | def test_install_missing_skill_md(self): method test_install_dry_run (line 310) | def test_install_dry_run(self): class TestInstallToAllAgents (line 327) | class TestInstallToAllAgents: method setup_method (line 330) | def setup_method(self): method teardown_method (line 338) | def teardown_method(self): method test_install_to_all_success (line 342) | def test_install_to_all_success(self): method test_install_to_all_partial_success (line 359) | def test_install_to_all_partial_success(self): method test_install_to_all_with_force (line 370) | def test_install_to_all_with_force(self): method test_install_to_all_returns_results (line 397) | def test_install_to_all_returns_results(self): class TestInstallAgentCLI (line 410) | class TestInstallAgentCLI: method setup_method (line 413) | def setup_method(self): method teardown_method (line 421) | def teardown_method(self): method test_cli_help_output (line 425) | def test_cli_help_output(self): method test_cli_requires_agent_flag (line 436) | def test_cli_requires_agent_flag(self): method test_cli_dry_run (line 447) | def test_cli_dry_run(self): method test_cli_integration (line 476) | def test_cli_integration(self): method test_cli_install_to_all (line 507) | def test_cli_install_to_all(self): FILE: tests/test_install_multiplatform.py class TestInstallCLI (line 11) | class TestInstallCLI(unittest.TestCase): method test_cli_accepts_target_flag (line 14) | def test_cli_accepts_target_flag(self): method test_cli_rejects_invalid_target (line 42) | def test_cli_rejects_invalid_target(self): class TestInstallToolMultiPlatform (line 57) | class TestInstallToolMultiPlatform(unittest.IsolatedAsyncioTestCase): method test_install_tool_accepts_target_parameter (line 60) | async def test_install_tool_accepts_target_parameter(self): method test_install_tool_uses_correct_adaptor (line 89) | async def test_install_tool_uses_correct_adaptor(self): method test_install_tool_platform_specific_api_keys (line 98) | async def test_install_tool_platform_specific_api_keys(self): class TestInstallWorkflowIntegration (line 117) | class TestInstallWorkflowIntegration(unittest.IsolatedAsyncioTestCase): method test_dry_run_shows_correct_platform (line 120) | async def test_dry_run_shows_correct_platform(self): FILE: tests/test_install_skill.py class TestInstallSkillValidation (line 31) | class TestInstallSkillValidation: method test_validation_no_config (line 35) | async def test_validation_no_config(self): method test_validation_both_configs (line 45) | async def test_validation_both_configs(self): class TestInstallSkillDryRun (line 58) | class TestInstallSkillDryRun: method test_dry_run_with_config_name (line 62) | async def test_dry_run_with_config_name(self): method test_dry_run_with_config_path (line 85) | async def test_dry_run_with_config_path(self): class TestInstallSkillEnhancementMandatory (line 107) | class TestInstallSkillEnhancementMandatory: method test_enhancement_is_mandatory (line 111) | async def test_enhancement_is_mandatory(self): class TestInstallSkillPhaseOrchestration (line 130) | class TestInstallSkillPhaseOrchestration: method test_full_workflow_with_fetch (line 141) | async def test_full_workflow_with_fetch( method test_workflow_with_existing_config (line 213) | async def test_workflow_with_existing_config( class TestInstallSkillErrorHandling (line 261) | class TestInstallSkillErrorHandling: method test_fetch_phase_failure (line 266) | async def test_fetch_phase_failure(self, mock_fetch): method test_scrape_phase_failure (line 284) | async def test_scrape_phase_failure(self, mock_open, mock_scrape): method test_enhancement_phase_failure (line 311) | async def test_enhancement_phase_failure(self, mock_open, mock_subproc... class TestInstallSkillOptions (line 337) | class TestInstallSkillOptions: method test_no_upload_option (line 341) | async def test_no_upload_option(self): method test_unlimited_option (line 354) | async def test_unlimited_option(self): method test_custom_destination (line 366) | async def test_custom_destination(self): FILE: tests/test_install_skill_e2e.py class TestInstallSkillE2E (line 61) | class TestInstallSkillE2E: method test_config_file (line 65) | def test_config_file(self, tmp_path): method mock_scrape_output (line 85) | def mock_scrape_output(self, tmp_path): method test_e2e_with_config_path_no_upload (line 98) | async def test_e2e_with_config_path_no_upload( method test_e2e_with_config_name_fetch (line 165) | async def test_e2e_with_config_name_fetch(self, tmp_path): method test_e2e_dry_run_mode (line 240) | async def test_e2e_dry_run_mode(self, test_config_file): method test_e2e_error_handling_scrape_failure (line 263) | async def test_e2e_error_handling_scrape_failure(self, test_config_file): method test_e2e_error_handling_enhancement_failure (line 283) | async def test_e2e_error_handling_enhancement_failure( class TestInstallSkillCLI_E2E (line 317) | class TestInstallSkillCLI_E2E: method test_config_file (line 321) | def test_config_file(self, tmp_path): method test_cli_dry_run (line 341) | async def test_cli_dry_run(self, test_config_file): method test_cli_validation_error_no_config (line 357) | def test_cli_validation_error_no_config(self): method test_cli_help (line 373) | def test_cli_help(self): method test_cli_full_workflow_mocked (line 396) | async def test_cli_full_workflow_mocked( method test_cli_via_unified_command (line 432) | def test_cli_via_unified_command(self, test_config_file): class TestInstallSkillE2E_RealFiles (line 451) | class TestInstallSkillE2E_RealFiles: method real_test_config (line 455) | def real_test_config(self, tmp_path): method test_e2e_real_scrape_with_mocked_enhancement (line 487) | async def test_e2e_real_scrape_with_mocked_enhancement(self, real_test... FILE: tests/test_integration.py class TestDryRunMode (line 22) | class TestDryRunMode(unittest.TestCase): method setUp (line 25) | def setUp(self): method test_dry_run_no_directories_created (line 36) | def test_dry_run_no_directories_created(self): method test_dry_run_flag_set (line 47) | def test_dry_run_flag_set(self): method test_normal_mode_creates_directories (line 59) | def test_normal_mode_creates_directories(self): class TestConfigLoading (line 75) | class TestConfigLoading(unittest.TestCase): method setUp (line 78) | def setUp(self): method tearDown (line 82) | def tearDown(self): method test_load_valid_config (line 86) | def test_load_valid_config(self): method test_load_invalid_json (line 115) | def test_load_invalid_json(self): method test_load_nonexistent_file (line 124) | def test_load_nonexistent_file(self): method test_load_config_with_validation_errors (line 131) | def test_load_config_with_validation_errors(self): class TestRealConfigFiles (line 148) | class TestRealConfigFiles(unittest.TestCase): method test_godot_config (line 151) | def test_godot_config(self): method test_react_config (line 164) | def test_react_config(self): method test_vue_config (line 172) | def test_vue_config(self): method test_django_config (line 180) | def test_django_config(self): method test_fastapi_config (line 188) | def test_fastapi_config(self): method test_steam_economy_config (line 198) | def test_steam_economy_config(self): class TestURLProcessing (line 209) | class TestURLProcessing(unittest.TestCase): method test_url_normalization (line 212) | def test_url_normalization(self): method test_start_urls_fallback (line 227) | def test_start_urls_fallback(self): method test_multiple_start_urls (line 242) | def test_multiple_start_urls(self): class TestLlmsTxtIntegration (line 262) | class TestLlmsTxtIntegration(unittest.TestCase): method test_scraper_has_llms_txt_attributes (line 265) | def test_scraper_has_llms_txt_attributes(self): method test_scraper_has_try_llms_txt_method (line 280) | def test_scraper_has_try_llms_txt_method(self): class TestContentExtraction (line 296) | class TestContentExtraction(unittest.TestCase): method setUp (line 299) | def setUp(self): method test_extract_empty_content (line 310) | def test_extract_empty_content(self): method test_extract_basic_content (line 324) | def test_extract_basic_content(self): class TestFullLlmsTxtWorkflow (line 352) | class TestFullLlmsTxtWorkflow(unittest.TestCase): method setUp (line 355) | def setUp(self): method tearDown (line 427) | def tearDown(self): method test_full_llms_txt_workflow (line 434) | def test_full_llms_txt_workflow(self): method test_multi_variant_download (line 518) | def test_multi_variant_download(self): function test_no_content_truncation (line 581) | def test_no_content_truncation(): FILE: tests/test_integration_adaptors.py function sample_skill_dir (line 29) | def sample_skill_dir(tmp_path): function check_service_available (line 112) | def check_service_available(url: str, timeout: int = 5) -> bool: class TestWeaviateIntegration (line 124) | class TestWeaviateIntegration: method test_complete_workflow_with_weaviate (line 127) | def test_complete_workflow_with_weaviate(self, sample_skill_dir, tmp_p... method test_weaviate_metadata_preservation (line 212) | def test_weaviate_metadata_preservation(self, sample_skill_dir, tmp_pa... class TestChromaIntegration (line 274) | class TestChromaIntegration: method test_complete_workflow_with_chroma (line 277) | def test_complete_workflow_with_chroma(self, sample_skill_dir, tmp_path): method test_chroma_query_filtering (line 357) | def test_chroma_query_filtering(self, sample_skill_dir, tmp_path): class TestQdrantIntegration (line 407) | class TestQdrantIntegration: method test_complete_workflow_with_qdrant (line 410) | def test_complete_workflow_with_qdrant(self, sample_skill_dir, tmp_path): method test_qdrant_payload_filtering (line 509) | def test_qdrant_payload_filtering(self, sample_skill_dir, tmp_path): FILE: tests/test_issue_219_e2e.py class TestIssue219Problem1LargeFiles (line 34) | class TestIssue219Problem1LargeFiles(unittest.TestCase): method setUp (line 37) | def setUp(self): method test_large_file_extraction_end_to_end (line 53) | def test_large_file_extraction_end_to_end(self): method test_large_file_fallback_on_error (line 93) | def test_large_file_fallback_on_error(self): class TestIssue219Problem2CLIFlags (line 119) | class TestIssue219Problem2CLIFlags(unittest.TestCase): method test_github_command_has_enhancement_flags (line 122) | def test_github_command_has_enhancement_flags(self): method test_github_command_accepts_enhance_level_flag (line 135) | def test_github_command_accepts_enhance_level_flag(self): method test_cli_dispatcher_forwards_flags_to_github_scraper (line 158) | def test_cli_dispatcher_forwards_flags_to_github_scraper(self): class TestIssue219Problem3CustomAPIEndpoints (line 199) | class TestIssue219Problem3CustomAPIEndpoints(unittest.TestCase): method setUp (line 202) | def setUp(self): method tearDown (line 216) | def tearDown(self): method test_anthropic_base_url_support (line 220) | def test_anthropic_base_url_support(self): method test_anthropic_auth_token_support (line 250) | def test_anthropic_auth_token_support(self): method test_thinking_block_handling (line 283) | def test_thinking_block_handling(self): class TestIssue219IntegrationAll (line 335) | class TestIssue219IntegrationAll(unittest.TestCase): method test_all_fixes_work_together (line 338) | def test_all_fixes_work_together(self): FILE: tests/test_issue_277_real_world.py class TestIssue277RealWorld (line 12) | class TestIssue277RealWorld(unittest.TestCase): method setUp (line 15) | def setUp(self): method test_mikro_orm_urls_from_issue_277 (line 29) | def test_mikro_orm_urls_from_issue_277(self): method test_no_404_causing_urls_generated (line 90) | def test_no_404_causing_urls_generated(self): method test_deduplication_prevents_multiple_requests (line 121) | def test_deduplication_prevents_multiple_requests(self): method test_md_files_with_anchors_preserved (line 144) | def test_md_files_with_anchors_preserved(self): method test_real_scraping_scenario_no_404s (line 165) | def test_real_scraping_scenario_no_404s(self, mock_get): method test_issue_277_error_message_urls (line 213) | def test_issue_277_error_message_urls(self): FILE: tests/test_language_detector.py class TestCSSClassDetection (line 17) | class TestCSSClassDetection: method test_language_prefix (line 20) | def test_language_prefix(self): method test_lang_prefix (line 30) | def test_lang_prefix(self): method test_brush_pattern (line 40) | def test_brush_pattern(self): method test_bare_class_name (line 50) | def test_bare_class_name(self): method test_unknown_language (line 60) | def test_unknown_language(self): method test_empty_classes (line 70) | def test_empty_classes(self): method test_detect_from_html_with_css_class (line 77) | def test_detect_from_html_with_css_class(self): method test_detect_from_html_with_parent_class (line 90) | def test_detect_from_html_with_parent_class(self): class TestUnityCSharpDetection (line 104) | class TestUnityCSharpDetection: method test_unity_monobehaviour_detection (line 107) | def test_unity_monobehaviour_detection(self): method test_unity_lifecycle_methods (line 128) | def test_unity_lifecycle_methods(self): method test_unity_coroutine_detection (line 144) | def test_unity_coroutine_detection(self): method test_unity_serializefield_attribute (line 159) | def test_unity_serializefield_attribute(self): method test_unity_types (line 175) | def test_unity_types(self): method test_unity_namespace (line 190) | def test_unity_namespace(self): method test_generic_csharp_vs_unity (line 211) | def test_generic_csharp_vs_unity(self): method test_unity_minimal_code (line 234) | def test_unity_minimal_code(self): method test_unity_input_system (line 243) | def test_unity_input_system(self): method test_unity_full_script (line 256) | def test_unity_full_script(self): class TestLanguageDetection (line 300) | class TestLanguageDetection: method test_python_detection (line 303) | def test_python_detection(self): method test_javascript_detection (line 321) | def test_javascript_detection(self): method test_typescript_detection (line 339) | def test_typescript_detection(self): method test_java_detection (line 360) | def test_java_detection(self): method test_go_detection (line 376) | def test_go_detection(self): method test_rust_detection (line 395) | def test_rust_detection(self): method test_php_detection (line 415) | def test_php_detection(self): method test_jsx_detection (line 433) | def test_jsx_detection(self): method test_vue_detection (line 453) | def test_vue_detection(self): method test_sql_detection (line 475) | def test_sql_detection(self): class TestEdgeCases (line 492) | class TestEdgeCases: method test_short_code_snippet (line 495) | def test_short_code_snippet(self): method test_empty_code (line 504) | def test_empty_code(self): method test_whitespace_only (line 512) | def test_whitespace_only(self): method test_comments_only (line 521) | def test_comments_only(self): method test_mixed_languages (line 535) | def test_mixed_languages(self): method test_confidence_threshold (line 553) | def test_confidence_threshold(self): method test_html_with_embedded_css (line 567) | def test_html_with_embedded_css(self): method test_case_insensitive_patterns (line 583) | def test_case_insensitive_patterns(self): method test_r_language_detection (line 597) | def test_r_language_detection(self): method test_julia_detection (line 614) | def test_julia_detection(self): method test_gdscript_detection (line 631) | def test_gdscript_detection(self): method test_multiple_confidence_scores (line 651) | def test_multiple_confidence_scores(self): class TestIntegration (line 670) | class TestIntegration: method test_detect_from_html_fallback_to_patterns (line 673) | def test_detect_from_html_fallback_to_patterns(self): method test_backward_compatibility_with_doc_scraper (line 688) | def test_backward_compatibility_with_doc_scraper(self): FILE: tests/test_llms_txt_detector.py function test_detect_llms_txt_variants (line 6) | def test_detect_llms_txt_variants(): function test_detect_no_llms_txt (line 23) | def test_detect_no_llms_txt(): function test_url_parsing_with_complex_paths (line 38) | def test_url_parsing_with_complex_paths(): function test_detect_all_variants (line 56) | def test_detect_all_variants(): FILE: tests/test_llms_txt_downloader.py function test_successful_download (line 8) | def test_successful_download(): function test_timeout_with_retry (line 29) | def test_timeout_with_retry(): function test_empty_content_rejection (line 44) | def test_empty_content_rejection(): function test_non_markdown_rejection (line 58) | def test_non_markdown_rejection(): function test_http_error_handling (line 72) | def test_http_error_handling(): function test_exponential_backoff (line 89) | def test_exponential_backoff(): function test_markdown_validation (line 106) | def test_markdown_validation(): function test_custom_timeout (line 122) | def test_custom_timeout(): function test_custom_max_retries (line 139) | def test_custom_max_retries(): function test_user_agent_header (line 153) | def test_user_agent_header(): function test_get_proper_filename (line 170) | def test_get_proper_filename(): function test_get_proper_filename_standard (line 180) | def test_get_proper_filename_standard(): function test_get_proper_filename_small (line 189) | def test_get_proper_filename_small(): function test_is_markdown_rejects_html_doctype (line 198) | def test_is_markdown_rejects_html_doctype(): function test_is_markdown_rejects_html_tag (line 212) | def test_is_markdown_rejects_html_tag(): function test_is_markdown_rejects_html_meta (line 224) | def test_is_markdown_rejects_html_meta(): function test_is_markdown_accepts_markdown_with_html_words (line 235) | def test_is_markdown_accepts_markdown_with_html_words(): function test_html_detection_only_scans_first_500_chars (line 247) | def test_html_detection_only_scans_first_500_chars(): function test_html_redirect_trap_scenario (line 262) | def test_html_redirect_trap_scenario(): function test_download_rejects_html_redirect (line 283) | def test_download_rejects_html_redirect(): FILE: tests/test_llms_txt_parser.py function test_parse_markdown_sections (line 4) | def test_parse_markdown_sections(): FILE: tests/test_markdown_parsing.py class TestMarkdownContentExtraction (line 16) | class TestMarkdownContentExtraction(unittest.TestCase): method setUp (line 19) | def setUp(self): method tearDown (line 32) | def tearDown(self): method test_extract_title_from_h1 (line 38) | def test_extract_title_from_h1(self): method test_extract_headings_h2_to_h6 (line 44) | def test_extract_headings_h2_to_h6(self): method test_extract_code_blocks_with_language (line 62) | def test_extract_code_blocks_with_language(self): method test_extract_markdown_links_only_md_files (line 87) | def test_extract_markdown_links_only_md_files(self): method test_extract_content_paragraphs (line 103) | def test_extract_content_paragraphs(self): method test_detect_html_in_md_url (line 117) | def test_detect_html_in_md_url(self): class TestHtmlAsMarkdownExtraction (line 126) | class TestHtmlAsMarkdownExtraction(unittest.TestCase): method setUp (line 129) | def setUp(self): method tearDown (line 142) | def tearDown(self): method test_extract_title_from_html (line 148) | def test_extract_title_from_html(self): method test_find_main_content_area (line 154) | def test_find_main_content_area(self): method test_extract_code_blocks_from_html (line 169) | def test_extract_code_blocks_from_html(self): method test_fallback_to_body_when_no_main (line 181) | def test_fallback_to_body_when_no_main(self): class TestLlmsTxtUrlExtraction (line 195) | class TestLlmsTxtUrlExtraction(unittest.TestCase): method test_extract_markdown_style_links (line 198) | def test_extract_markdown_style_links(self): method test_extract_bare_urls (line 216) | def test_extract_bare_urls(self): method test_resolve_relative_urls (line 230) | def test_resolve_relative_urls(self): method test_clean_url_invalid_anchor_pattern (line 244) | def test_clean_url_invalid_anchor_pattern(self): method test_clean_url_valid_anchor (line 254) | def test_clean_url_valid_anchor(self): method test_clean_url_no_anchor (line 264) | def test_clean_url_no_anchor(self): method test_clean_url_bracket_encoding (line 273) | def test_clean_url_bracket_encoding(self): method test_clean_url_bracket_encoding_preserves_host (line 282) | def test_clean_url_bracket_encoding_preserves_host(self): method test_clean_url_bracket_in_query (line 294) | def test_clean_url_bracket_in_query(self): method test_clean_url_malformed_anchor_with_brackets (line 303) | def test_clean_url_malformed_anchor_with_brackets(self): method test_deduplicate_urls (line 313) | def test_deduplicate_urls(self): class TestSavePageContentFiltering (line 330) | class TestSavePageContentFiltering(unittest.TestCase): method setUp (line 333) | def setUp(self): method tearDown (line 346) | def tearDown(self): method test_skip_empty_content (line 352) | def test_skip_empty_content(self): method test_skip_short_content_under_50_chars (line 368) | def test_skip_short_content_under_50_chars(self): method test_save_content_over_50_chars (line 384) | def test_save_content_over_50_chars(self): FILE: tests/test_mcp_fastmcp.py function temp_dirs (line 48) | def temp_dirs(tmp_path): function sample_config (line 62) | def sample_config(temp_dirs): function unified_config (line 89) | def unified_config(temp_dirs): class TestFastMCPServerInitialization (line 117) | class TestFastMCPServerInitialization: method test_server_import (line 120) | def test_server_import(self): method test_server_has_name (line 125) | def test_server_has_name(self): method test_server_has_instructions (line 129) | def test_server_has_instructions(self): method test_all_tools_registered (line 134) | def test_all_tools_registered(self): class TestConfigTools (line 175) | class TestConfigTools: method test_generate_config_basic (line 178) | async def test_generate_config_basic(self, temp_dirs, monkeypatch): method test_generate_config_with_options (line 198) | async def test_generate_config_with_options(self, temp_dirs, monkeypat... method test_generate_config_unlimited (line 213) | async def test_generate_config_unlimited(self, temp_dirs, monkeypatch): method test_list_configs (line 227) | async def test_list_configs(self, temp_dirs): method test_validate_config_valid (line 235) | async def test_validate_config_valid(self, sample_config): method test_validate_config_unified (line 242) | async def test_validate_config_unified(self, unified_config): method test_validate_config_missing_file (line 250) | async def test_validate_config_missing_file(self, temp_dirs): class TestScrapingTools (line 268) | class TestScrapingTools: method test_estimate_pages_basic (line 271) | async def test_estimate_pages_basic(self, sample_config): method test_estimate_pages_unlimited (line 282) | async def test_estimate_pages_unlimited(self, sample_config): method test_estimate_pages_custom_discovery (line 288) | async def test_estimate_pages_custom_discovery(self, sample_config): method test_scrape_docs_basic (line 296) | async def test_scrape_docs_basic(self, sample_config): method test_scrape_docs_with_enhancement (line 305) | async def test_scrape_docs_with_enhancement(self, sample_config): method test_scrape_docs_skip_scrape (line 313) | async def test_scrape_docs_skip_scrape(self, sample_config): method test_scrape_docs_unified (line 319) | async def test_scrape_docs_unified(self, unified_config): method test_scrape_docs_merge_mode_override (line 325) | async def test_scrape_docs_merge_mode_override(self, unified_config): method test_scrape_github_basic (line 333) | async def test_scrape_github_basic(self): method test_scrape_github_with_token (line 344) | async def test_scrape_github_with_token(self): method test_scrape_github_options (line 352) | async def test_scrape_github_options(self): method test_scrape_pdf_basic (line 365) | async def test_scrape_pdf_basic(self, temp_dirs): method test_scrape_pdf_direct_path (line 380) | async def test_scrape_pdf_direct_path(self): method test_scrape_codebase_basic (line 388) | async def test_scrape_codebase_basic(self, temp_dirs): method test_scrape_codebase_with_options (line 401) | async def test_scrape_codebase_with_options(self, temp_dirs): class TestPackagingTools (line 427) | class TestPackagingTools: method test_package_skill_basic (line 430) | async def test_package_skill_basic(self, temp_dirs): method test_package_skill_with_auto_upload (line 444) | async def test_package_skill_with_auto_upload(self, temp_dirs): method test_upload_skill_basic (line 454) | async def test_upload_skill_basic(self, temp_dirs): method test_upload_skill_missing_file (line 467) | async def test_upload_skill_missing_file(self, temp_dirs): method test_install_skill_with_config_name (line 475) | async def test_install_skill_with_config_name(self): method test_install_skill_with_config_path (line 487) | async def test_install_skill_with_config_path(self, sample_config): method test_install_skill_unlimited (line 498) | async def test_install_skill_unlimited(self): method test_install_skill_no_upload (line 509) | async def test_install_skill_no_upload(self): class TestSplittingTools (line 528) | class TestSplittingTools: method test_split_config_auto_strategy (line 531) | async def test_split_config_auto_strategy(self, sample_config): method test_split_config_category_strategy (line 539) | async def test_split_config_category_strategy(self, sample_config): method test_split_config_size_strategy (line 547) | async def test_split_config_size_strategy(self, sample_config): method test_generate_router_basic (line 555) | async def test_generate_router_basic(self, temp_dirs): method test_generate_router_with_name (line 567) | async def test_generate_router_with_name(self, temp_dirs): class TestSourceTools (line 583) | class TestSourceTools: method test_fetch_config_list_api (line 586) | async def test_fetch_config_list_api(self): method test_fetch_config_download_api (line 603) | async def test_fetch_config_download_api(self, temp_dirs): method test_fetch_config_with_category_filter (line 611) | async def test_fetch_config_with_category_filter(self): method test_fetch_config_from_git_url (line 617) | async def test_fetch_config_from_git_url(self, temp_dirs): method test_fetch_config_from_source (line 627) | async def test_fetch_config_from_source(self, temp_dirs): method test_fetch_config_with_token (line 635) | async def test_fetch_config_with_token(self, temp_dirs): method test_fetch_config_refresh_cache (line 646) | async def test_fetch_config_refresh_cache(self, temp_dirs): method test_submit_config_with_path (line 657) | async def test_submit_config_with_path(self, sample_config): method test_submit_config_with_json (line 665) | async def test_submit_config_with_json(self): method test_add_config_source_basic (line 675) | async def test_add_config_source_basic(self): method test_add_config_source_with_options (line 683) | async def test_add_config_source_with_options(self): method test_add_config_source_ssh_url (line 697) | async def test_add_config_source_ssh_url(self): method test_list_config_sources_all (line 705) | async def test_list_config_sources_all(self): method test_list_config_sources_enabled_only (line 711) | async def test_list_config_sources_enabled_only(self): method test_remove_config_source (line 717) | async def test_remove_config_source(self): class TestFastMCPIntegration (line 731) | class TestFastMCPIntegration: method test_workflow_generate_validate_scrape (line 734) | async def test_workflow_generate_validate_scrape(self, temp_dirs, monk... method test_workflow_source_fetch_scrape (line 750) | async def test_workflow_source_fetch_scrape(self, temp_dirs): method test_workflow_split_router (line 764) | async def test_workflow_split_router(self, sample_config, temp_dirs): class TestErrorHandling (line 786) | class TestErrorHandling: method test_generate_config_invalid_url (line 789) | async def test_generate_config_invalid_url(self, temp_dirs, monkeypatch): method test_validate_config_invalid_json (line 800) | async def test_validate_config_invalid_json(self, temp_dirs): method test_scrape_docs_missing_config (line 809) | async def test_scrape_docs_missing_config(self): method test_package_skill_missing_directory (line 821) | async def test_package_skill_missing_directory(self): class TestTypeValidation (line 835) | class TestTypeValidation: method test_generate_config_return_type (line 838) | async def test_generate_config_return_type(self, temp_dirs, monkeypatch): method test_list_configs_return_type (line 848) | async def test_list_configs_return_type(self): method test_estimate_pages_return_type (line 853) | async def test_estimate_pages_return_type(self, sample_config): method test_all_tools_return_strings (line 858) | async def test_all_tools_return_strings(self, sample_config, temp_dirs): FILE: tests/test_mcp_git_sources.py function temp_dirs (line 24) | def temp_dirs(tmp_path): function mock_git_repo (line 38) | def mock_git_repo(temp_dirs): class TestFetchConfigModes (line 60) | class TestFetchConfigModes: method test_fetch_config_api_mode_list (line 63) | async def test_fetch_config_api_mode_list(self): method test_fetch_config_api_mode_download (line 97) | async def test_fetch_config_api_mode_download(self, temp_dirs): method test_fetch_config_git_url_mode (line 132) | async def test_fetch_config_git_url_mode(self, mock_git_repo_class, te... method test_fetch_config_source_mode (line 170) | async def test_fetch_config_source_mode( method test_fetch_config_source_not_found (line 213) | async def test_fetch_config_source_not_found(self): method test_fetch_config_config_not_found_in_repo (line 230) | async def test_fetch_config_config_not_found_in_repo(self, mock_git_re... method test_fetch_config_invalid_git_url (line 254) | async def test_fetch_config_invalid_git_url(self, mock_git_repo_class): class TestSourceManagementTools (line 273) | class TestSourceManagementTools: method test_add_config_source (line 276) | async def test_add_config_source(self, temp_dirs): method test_add_config_source_missing_name (line 305) | async def test_add_config_source_missing_name(self): method test_add_config_source_missing_git_url (line 317) | async def test_add_config_source_missing_git_url(self): method test_add_config_source_invalid_name (line 329) | async def test_add_config_source_invalid_name(self): method test_list_config_sources (line 347) | async def test_list_config_sources(self): method test_list_config_sources_empty (line 386) | async def test_list_config_sources_empty(self): method test_list_config_sources_enabled_only (line 401) | async def test_list_config_sources_enabled_only(self): method test_remove_config_source (line 430) | async def test_remove_config_source(self): method test_remove_config_source_not_found (line 450) | async def test_remove_config_source_not_found(self): method test_remove_config_source_missing_name (line 471) | async def test_remove_config_source_missing_name(self): class TestCompleteWorkflow (line 486) | class TestCompleteWorkflow: method test_add_fetch_remove_workflow (line 491) | async def test_add_fetch_remove_workflow(self, mock_sm_class, mock_git... FILE: tests/test_mcp_server.py class TestMCPServerInitialization (line 48) | class TestMCPServerInitialization(unittest.TestCase): method test_server_import (line 51) | def test_server_import(self): method test_server_initialization (line 57) | def test_server_initialization(self): class TestListTools (line 66) | class TestListTools(unittest.IsolatedAsyncioTestCase): method test_list_tools_returns_tools (line 69) | async def test_list_tools_returns_tools(self): method test_tool_schemas (line 90) | async def test_tool_schemas(self): class TestGenerateConfigTool (line 106) | class TestGenerateConfigTool(unittest.IsolatedAsyncioTestCase): method asyncSetUp (line 109) | async def asyncSetUp(self): method asyncTearDown (line 115) | async def asyncTearDown(self): method test_generate_config_basic (line 120) | async def test_generate_config_basic(self): method test_generate_config_with_options (line 150) | async def test_generate_config_with_options(self): method test_generate_config_defaults (line 169) | async def test_generate_config_defaults(self): class TestEstimatePagesTool (line 184) | class TestEstimatePagesTool(unittest.IsolatedAsyncioTestCase): method asyncSetUp (line 187) | async def asyncSetUp(self): method asyncTearDown (line 206) | async def asyncTearDown(self): method test_estimate_pages_success (line 212) | async def test_estimate_pages_success(self, mock_streaming): method test_estimate_pages_with_max_discovery (line 229) | async def test_estimate_pages_with_max_discovery(self, mock_streaming): method test_estimate_pages_error (line 245) | async def test_estimate_pages_error(self, mock_streaming): class TestScrapeDocsTool (line 258) | class TestScrapeDocsTool(unittest.IsolatedAsyncioTestCase): method asyncSetUp (line 261) | async def asyncSetUp(self): method asyncTearDown (line 278) | async def asyncTearDown(self): method test_scrape_docs_basic (line 284) | async def test_scrape_docs_basic(self, mock_streaming): method test_scrape_docs_with_skip_scrape (line 297) | async def test_scrape_docs_with_skip_scrape(self, mock_streaming): method test_scrape_docs_with_dry_run (line 311) | async def test_scrape_docs_with_dry_run(self, mock_streaming): method test_scrape_docs_with_enhance_local (line 324) | async def test_scrape_docs_with_enhance_local(self, mock_streaming): class TestPackageSkillTool (line 338) | class TestPackageSkillTool(unittest.IsolatedAsyncioTestCase): method asyncSetUp (line 341) | async def asyncSetUp(self): method asyncTearDown (line 354) | async def asyncTearDown(self): method test_package_skill_success (line 360) | async def test_package_skill_success(self, mock_run): method test_package_skill_error (line 375) | async def test_package_skill_error(self, mock_run): class TestListConfigsTool (line 390) | class TestListConfigsTool(unittest.IsolatedAsyncioTestCase): method asyncSetUp (line 393) | async def asyncSetUp(self): method asyncTearDown (line 412) | async def asyncTearDown(self): method test_list_configs_success (line 417) | async def test_list_configs_success(self): method test_list_configs_empty (line 428) | async def test_list_configs_empty(self): method test_list_configs_no_directory (line 438) | async def test_list_configs_no_directory(self): class TestValidateConfigTool (line 449) | class TestValidateConfigTool(unittest.IsolatedAsyncioTestCase): method asyncSetUp (line 452) | async def asyncSetUp(self): method asyncTearDown (line 460) | async def asyncTearDown(self): method test_validate_valid_config (line 465) | async def test_validate_valid_config(self): method test_validate_invalid_config (line 493) | async def test_validate_invalid_config(self): method test_validate_nonexistent_config (line 513) | async def test_validate_nonexistent_config(self): class TestCallToolRouter (line 523) | class TestCallToolRouter(unittest.IsolatedAsyncioTestCase): method test_call_tool_unknown (line 526) | async def test_call_tool_unknown(self): method test_call_tool_exception_handling (line 533) | async def test_call_tool_exception_handling(self): class TestMCPServerIntegration (line 543) | class TestMCPServerIntegration(unittest.IsolatedAsyncioTestCase): method test_full_workflow_simulation (line 546) | async def test_full_workflow_simulation(self): class TestSubmitConfigTool (line 577) | class TestSubmitConfigTool(unittest.IsolatedAsyncioTestCase): method test_submit_config_requires_token (line 580) | async def test_submit_config_requires_token(self): method test_submit_config_validates_required_fields (line 588) | async def test_submit_config_validates_required_fields(self): method test_submit_config_validates_name_format (line 605) | async def test_submit_config_validates_name_format(self): method test_submit_config_validates_url_format (line 614) | async def test_submit_config_validates_url_format(self): method test_submit_config_rejects_legacy_format (line 623) | async def test_submit_config_rejects_legacy_format(self): method test_submit_config_accepts_unified_format (line 640) | async def test_submit_config_accepts_unified_format(self): method test_submit_config_from_file_path (line 665) | async def test_submit_config_from_file_path(self): method test_submit_config_detects_category (line 694) | async def test_submit_config_detects_category(self): FILE: tests/test_mcp_vector_dbs.py function run_async (line 30) | def run_async(coro): function test_skill_dir (line 36) | def test_skill_dir(): function test_export_to_weaviate (line 60) | def test_export_to_weaviate(test_skill_dir): function test_export_to_chroma (line 83) | def test_export_to_chroma(test_skill_dir): function test_export_to_faiss (line 106) | def test_export_to_faiss(test_skill_dir): function test_export_to_qdrant (line 129) | def test_export_to_qdrant(test_skill_dir): function test_export_with_default_output_dir (line 152) | def test_export_with_default_output_dir(test_skill_dir): function test_export_missing_skill_dir (line 166) | def test_export_missing_skill_dir(): function test_all_exports_create_files (line 179) | def test_all_exports_create_files(test_skill_dir): function test_export_output_includes_instructions (line 214) | def test_export_output_includes_instructions(): FILE: tests/test_mcp_workflow_tools.py function _text (line 40) | def _text(result_list) -> str: function user_dir (line 51) | def user_dir(tmp_path, monkeypatch): function bundled_names_empty (line 62) | def bundled_names_empty(monkeypatch): function bundled_fixture (line 71) | def bundled_fixture(monkeypatch): class TestListWorkflowsTool (line 92) | class TestListWorkflowsTool: method test_empty_returns_empty_list (line 93) | def test_empty_returns_empty_list(self, user_dir, bundled_names_empty,... method test_returns_bundled_workflows (line 105) | def test_returns_bundled_workflows(self, user_dir, bundled_fixture): method test_bundled_source_label (line 114) | def test_bundled_source_label(self, user_dir, bundled_fixture): method test_returns_user_workflows (line 122) | def test_returns_user_workflows(self, user_dir, bundled_names_empty, m... method test_user_and_bundled_combined (line 136) | def test_user_and_bundled_combined(self, user_dir, bundled_fixture): method test_descriptions_extracted (line 148) | def test_descriptions_extracted(self, user_dir, bundled_fixture): method test_ignores_args_parameter (line 156) | def test_ignores_args_parameter(self, user_dir, bundled_names_empty, m... class TestGetWorkflowTool (line 173) | class TestGetWorkflowTool: method test_missing_name_returns_error (line 174) | def test_missing_name_returns_error(self, user_dir, bundled_names_empt... method test_empty_name_returns_error (line 185) | def test_empty_name_returns_error(self, user_dir, bundled_names_empty,... method test_not_found_returns_error_with_available (line 195) | def test_not_found_returns_error_with_available(self, user_dir, bundle... method test_returns_bundled_content (line 203) | def test_returns_bundled_content(self, user_dir, bundled_fixture): method test_returns_user_workflow_content (line 210) | def test_returns_user_workflow_content(self, user_dir, bundled_names_e... method test_user_dir_takes_priority_over_bundled (line 223) | def test_user_dir_takes_priority_over_bundled(self, user_dir, bundled_... method test_not_found_no_available_shows_none (line 234) | def test_not_found_no_available_shows_none(self, user_dir, bundled_nam... class TestCreateWorkflowTool (line 250) | class TestCreateWorkflowTool: method test_missing_name_returns_error (line 251) | def test_missing_name_returns_error(self, user_dir): method test_missing_content_returns_error (line 258) | def test_missing_content_returns_error(self, user_dir): method test_invalid_yaml_returns_error (line 265) | def test_invalid_yaml_returns_error(self, user_dir): method test_missing_stages_returns_error (line 271) | def test_missing_stages_returns_error(self, user_dir): method test_creates_file_in_user_dir (line 278) | def test_creates_file_in_user_dir(self, user_dir): method test_created_file_contains_content (line 285) | def test_created_file_contains_content(self, user_dir): method test_duplicate_name_returns_error (line 292) | def test_duplicate_name_returns_error(self, user_dir): method test_success_message_contains_name (line 300) | def test_success_message_contains_name(self, user_dir): method test_creates_user_dir_if_missing (line 306) | def test_creates_user_dir_if_missing(self, tmp_path, monkeypatch): class TestUpdateWorkflowTool (line 324) | class TestUpdateWorkflowTool: method test_missing_name_returns_error (line 325) | def test_missing_name_returns_error(self, user_dir): method test_missing_content_returns_error (line 332) | def test_missing_content_returns_error(self, user_dir): method test_invalid_yaml_returns_error (line 339) | def test_invalid_yaml_returns_error(self, user_dir): method test_missing_stages_returns_error (line 345) | def test_missing_stages_returns_error(self, user_dir): method test_cannot_update_bundled_only (line 351) | def test_cannot_update_bundled_only(self, user_dir, bundled_fixture): method test_updates_existing_user_workflow (line 359) | def test_updates_existing_user_workflow(self, user_dir, bundled_names_... method test_can_update_user_copy_of_bundled (line 375) | def test_can_update_user_copy_of_bundled(self, user_dir, bundled_fixtu... method test_success_message_contains_name (line 386) | def test_success_message_contains_name(self, user_dir, bundled_names_e... class TestDeleteWorkflowTool (line 405) | class TestDeleteWorkflowTool: method test_missing_name_returns_error (line 406) | def test_missing_name_returns_error(self, user_dir): method test_empty_name_returns_error (line 413) | def test_empty_name_returns_error(self, user_dir): method test_cannot_delete_bundled (line 419) | def test_cannot_delete_bundled(self, user_dir, bundled_fixture): method test_not_found_user_workflow_returns_error (line 426) | def test_not_found_user_workflow_returns_error( method test_deletes_user_yaml_file (line 439) | def test_deletes_user_yaml_file(self, user_dir, bundled_names_empty, m... method test_deletes_user_yml_extension (line 454) | def test_deletes_user_yml_extension(self, user_dir, bundled_names_empt... method test_success_message_contains_path (line 469) | def test_success_message_contains_path(self, user_dir, bundled_names_e... class TestWorkflowRoundTrip (line 488) | class TestWorkflowRoundTrip: method test_full_lifecycle (line 489) | def test_full_lifecycle(self, user_dir, bundled_names_empty, monkeypat... FILE: tests/test_merge_sources_github.py class TestIssueCategorization (line 21) | class TestIssueCategorization: method test_categorize_issues_basic (line 24) | def test_categorize_issues_basic(self): method test_categorize_issues_keyword_matching (line 61) | def test_categorize_issues_keyword_matching(self): method test_categorize_issues_multi_keyword_topic (line 81) | def test_categorize_issues_multi_keyword_topic(self): method test_categorize_issues_no_match_goes_to_other (line 102) | def test_categorize_issues_no_match_goes_to_other(self): method test_categorize_issues_empty_lists (line 122) | def test_categorize_issues_empty_lists(self): class TestHybridContent (line 130) | class TestHybridContent: method test_generate_hybrid_content_basic (line 133) | def test_generate_hybrid_content_basic(self): method test_generate_hybrid_content_with_conflicts (line 196) | def test_generate_hybrid_content_with_conflicts(self): method test_generate_hybrid_content_no_github_data (line 230) | def test_generate_hybrid_content_no_github_data(self): class TestIssueToAPIMatching (line 243) | class TestIssueToAPIMatching: method test_match_issues_to_apis_basic (line 246) | def test_match_issues_to_apis_basic(self): method test_match_issues_to_apis_no_matches (line 282) | def test_match_issues_to_apis_no_matches(self): method test_match_issues_to_apis_dotted_names (line 301) | def test_match_issues_to_apis_dotted_names(self): class TestRuleBasedMergerWithGitHubStreams (line 322) | class TestRuleBasedMergerWithGitHubStreams: method test_merger_with_github_streams (line 325) | def test_merger_with_github_streams(self, tmp_path): method test_merger_merge_all_with_streams (line 359) | def test_merger_merge_all_with_streams(self, tmp_path): method test_merger_without_streams_backward_compat (line 383) | def test_merger_without_streams_backward_compat(self): class TestIntegration (line 404) | class TestIntegration: method test_full_pipeline_with_streams (line 407) | def test_full_pipeline_with_streams(self, tmp_path): FILE: tests/test_multi_source.py class TestUnifiedScraperDataStructure (line 18) | class TestUnifiedScraperDataStructure(unittest.TestCase): method test_scraped_data_uses_list_structure (line 21) | def test_scraped_data_uses_list_structure(self): method test_source_counters_initialized_to_zero (line 43) | def test_source_counters_initialized_to_zero(self): method test_empty_lists_initially (line 65) | def test_empty_lists_initially(self): class TestUnifiedSkillBuilderDocsReferences (line 88) | class TestUnifiedSkillBuilderDocsReferences(unittest.TestCase): method setUp (line 91) | def setUp(self): method tearDown (line 97) | def tearDown(self): method test_creates_subdirectory_per_source (line 103) | def test_creates_subdirectory_per_source(self): method test_creates_index_per_source (line 141) | def test_creates_index_per_source(self): method test_creates_main_index_listing_all_sources (line 176) | def test_creates_main_index_listing_all_sources(self): method test_copies_reference_files_to_source_dir (line 218) | def test_copies_reference_files_to_source_dir(self): class TestUnifiedSkillBuilderGitHubReferences (line 254) | class TestUnifiedSkillBuilderGitHubReferences(unittest.TestCase): method setUp (line 257) | def setUp(self): method tearDown (line 263) | def tearDown(self): method test_creates_subdirectory_per_repo (line 269) | def test_creates_subdirectory_per_repo(self): method test_creates_readme_per_repo (line 299) | def test_creates_readme_per_repo(self): method test_creates_issues_file_when_issues_exist (line 334) | def test_creates_issues_file_when_issues_exist(self): method test_creates_main_index_listing_all_repos (line 385) | def test_creates_main_index_listing_all_repos(self): class TestUnifiedSkillBuilderPdfReferences (line 431) | class TestUnifiedSkillBuilderPdfReferences(unittest.TestCase): method setUp (line 434) | def setUp(self): method tearDown (line 440) | def tearDown(self): method test_creates_pdf_index_with_count (line 446) | def test_creates_pdf_index_with_count(self): FILE: tests/test_multilang_support.py function test_detect_english (line 25) | def test_detect_english(): function test_detect_spanish (line 37) | def test_detect_spanish(): function test_detect_french (line 48) | def test_detect_french(): function test_detect_german (line 59) | def test_detect_german(): function test_detect_chinese (line 70) | def test_detect_chinese(): function test_detect_from_filename_dot_pattern (line 81) | def test_detect_from_filename_dot_pattern(): function test_detect_from_filename_underscore_pattern (line 90) | def test_detect_from_filename_underscore_pattern(): function test_detect_from_filename_dash_pattern (line 98) | def test_detect_from_filename_dash_pattern(): function test_detect_from_filename_no_match (line 106) | def test_detect_from_filename_no_match(): function test_add_document_single_language (line 114) | def test_add_document_single_language(): function test_add_document_multiple_languages (line 125) | def test_add_document_multiple_languages(): function test_force_language (line 139) | def test_force_language(): function test_filename_language_priority (line 150) | def test_filename_language_priority(): function test_document_count_all (line 161) | def test_document_count_all(): function test_primary_language (line 174) | def test_primary_language(): function test_translation_status (line 185) | def test_translation_status(): function test_export_by_language (line 201) | def test_export_by_language(): function test_translation_report_generation (line 225) | def test_translation_report_generation(): function test_empty_manager (line 240) | def test_empty_manager(): function test_script_detection (line 249) | def test_script_detection(): function test_confidence_scoring (line 262) | def test_confidence_scoring(): function test_metadata_preservation (line 274) | def test_metadata_preservation(): FILE: tests/test_new_source_types.py class TestSourceDetectorNewTypes (line 27) | class TestSourceDetectorNewTypes: method test_detect_ipynb (line 31) | def test_detect_ipynb(self): method test_detect_html_extension (line 39) | def test_detect_html_extension(self): method test_detect_htm_extension (line 45) | def test_detect_htm_extension(self): method test_detect_pptx (line 52) | def test_detect_pptx(self): method test_detect_adoc (line 60) | def test_detect_adoc(self): method test_detect_asciidoc_extension (line 66) | def test_detect_asciidoc_extension(self): method test_detect_man_extension (line 73) | def test_detect_man_extension(self): method test_detect_man_sections (line 80) | def test_detect_man_sections(self, section): method test_man_section_with_dotted_basename_not_detected (line 87) | def test_man_section_with_dotted_basename_not_detected(self): method test_detect_rss_extension (line 101) | def test_detect_rss_extension(self): method test_detect_atom_extension (line 107) | def test_detect_atom_extension(self): method test_xml_not_detected_as_rss (line 113) | def test_xml_not_detected_as_rss(self): method test_yaml_with_openapi_content_detected (line 125) | def test_yaml_with_openapi_content_detected(self, tmp_path): method test_yaml_with_swagger_content_detected (line 142) | def test_yaml_with_swagger_content_detected(self, tmp_path): method test_yaml_without_openapi_not_detected (line 156) | def test_yaml_without_openapi_not_detected(self, tmp_path): method test_looks_like_openapi_returns_false_for_missing_file (line 176) | def test_looks_like_openapi_returns_false_for_missing_file(self): method test_looks_like_openapi_json_key_format (line 180) | def test_looks_like_openapi_json_key_format(self, tmp_path): class TestConfigValidatorNewTypes (line 192) | class TestConfigValidatorNewTypes: method test_all_17_types_present (line 216) | def test_all_17_types_present(self): method test_unknown_type_rejected (line 220) | def test_unknown_type_rejected(self): method _make_config (line 233) | def _make_config(self, source: dict) -> dict: method test_epub_requires_path (line 241) | def test_epub_requires_path(self): method test_jupyter_requires_path (line 248) | def test_jupyter_requires_path(self): method test_html_requires_path (line 255) | def test_html_requires_path(self): method test_openapi_requires_path_or_url (line 262) | def test_openapi_requires_path_or_url(self): method test_openapi_accepts_url (line 269) | def test_openapi_accepts_url(self): method test_pptx_requires_path (line 275) | def test_pptx_requires_path(self): method test_asciidoc_requires_path (line 282) | def test_asciidoc_requires_path(self): method test_confluence_requires_url_or_path (line 289) | def test_confluence_requires_url_or_path(self): method test_confluence_accepts_base_url (line 296) | def test_confluence_accepts_base_url(self): method test_confluence_accepts_path (line 308) | def test_confluence_accepts_path(self): method test_notion_requires_url_or_path (line 314) | def test_notion_requires_url_or_path(self): method test_notion_accepts_page_id (line 321) | def test_notion_accepts_page_id(self): method test_notion_accepts_database_id (line 327) | def test_notion_accepts_database_id(self): method test_rss_requires_url_or_path (line 333) | def test_rss_requires_url_or_path(self): method test_rss_accepts_url (line 340) | def test_rss_accepts_url(self): method test_manpage_requires_path_or_names (line 346) | def test_manpage_requires_path_or_names(self): method test_manpage_accepts_names (line 353) | def test_manpage_accepts_names(self): method test_chat_requires_path_or_token (line 359) | def test_chat_requires_path_or_token(self): method test_chat_accepts_path (line 366) | def test_chat_accepts_path(self): method test_chat_accepts_token_with_channel (line 372) | def test_chat_accepts_token_with_channel(self): class TestUnifiedSkillBuilderGenericMerge (line 390) | class TestUnifiedSkillBuilderGenericMerge: method _make_builder (line 393) | def _make_builder(self, tmp_path) -> UnifiedSkillBuilder: method test_generic_merge_produces_valid_markdown (line 415) | def test_generic_merge_produces_valid_markdown(self, tmp_path): method test_generic_merge_includes_yaml_frontmatter (line 429) | def test_generic_merge_includes_yaml_frontmatter(self, tmp_path): method test_generic_merge_attributes_content_to_sources (line 441) | def test_generic_merge_attributes_content_to_sources(self, tmp_path): method test_generic_merge_single_source_section (line 454) | def test_generic_merge_single_source_section(self, tmp_path): method test_generic_merge_multi_source_section (line 465) | def test_generic_merge_multi_source_section(self, tmp_path): method test_generic_merge_footer (line 478) | def test_generic_merge_footer(self, tmp_path): method test_generic_merge_merged_from_line (line 487) | def test_generic_merge_merged_from_line(self, tmp_path): method test_append_extra_sources_adds_sections (line 498) | def test_append_extra_sources_adds_sections(self, tmp_path): method test_append_extra_sources_preserves_footer (line 515) | def test_append_extra_sources_preserves_footer(self, tmp_path): method test_source_labels_has_all_17_types (line 526) | def test_source_labels_has_all_17_types(self): method test_source_labels_values_are_nonempty_strings (line 549) | def test_source_labels_values_are_nonempty_strings(self): class TestCommandModules (line 561) | class TestCommandModules: method test_new_types_in_command_modules (line 577) | def test_new_types_in_command_modules(self): method test_command_modules_values_are_module_paths (line 582) | def test_command_modules_values_are_module_paths(self): method test_new_parser_names_include_all_10 (line 590) | def test_new_parser_names_include_all_10(self): method test_total_parser_count (line 596) | def test_total_parser_count(self): method test_no_duplicate_parser_names (line 600) | def test_no_duplicate_parser_names(self): method test_command_module_count (line 605) | def test_command_module_count(self): class TestSourceDetectorValidation (line 616) | class TestSourceDetectorValidation: method test_validation_passes_for_existing_jupyter (line 619) | def test_validation_passes_for_existing_jupyter(self, tmp_path): method test_validation_raises_for_nonexistent_jupyter (line 633) | def test_validation_raises_for_nonexistent_jupyter(self): method test_validation_passes_for_existing_html (line 644) | def test_validation_passes_for_existing_html(self, tmp_path): method test_validation_raises_for_nonexistent_pptx (line 657) | def test_validation_raises_for_nonexistent_pptx(self): method test_validation_passes_for_existing_openapi (line 668) | def test_validation_passes_for_existing_openapi(self, tmp_path): method test_validation_raises_for_nonexistent_asciidoc (line 681) | def test_validation_raises_for_nonexistent_asciidoc(self): method test_validation_raises_for_nonexistent_manpage (line 692) | def test_validation_raises_for_nonexistent_manpage(self): method test_validation_passes_for_existing_manpage (line 703) | def test_validation_passes_for_existing_manpage(self, tmp_path): method test_rss_url_validation_no_file_check (line 716) | def test_rss_url_validation_no_file_check(self): method test_rss_validation_raises_for_nonexistent_file (line 727) | def test_rss_validation_raises_for_nonexistent_file(self): method test_rss_validation_passes_for_existing_file (line 738) | def test_rss_validation_passes_for_existing_file(self, tmp_path): method test_validation_passes_for_directory_types (line 751) | def test_validation_passes_for_directory_types(self, tmp_path): class TestCreateCommandRouting (line 771) | class TestCreateCommandRouting: method test_route_to_scraper_source_coverage (line 790) | def test_route_to_scraper_source_coverage(self): method test_generic_route_module_names (line 808) | def test_generic_route_module_names(self): FILE: tests/test_package_skill.py class TestPackageSkill (line 14) | class TestPackageSkill(unittest.TestCase): method create_test_skill_directory (line 17) | def create_test_skill_directory(self, tmpdir): method test_package_valid_skill_directory (line 39) | def test_package_valid_skill_directory(self): method test_package_creates_correct_zip_structure (line 54) | def test_package_creates_correct_zip_structure(self): method test_package_excludes_backup_files (line 76) | def test_package_excludes_backup_files(self): method test_package_nonexistent_directory (line 95) | def test_package_nonexistent_directory(self): method test_package_directory_without_skill_md (line 104) | def test_package_directory_without_skill_md(self): method test_package_creates_zip_in_correct_location (line 117) | def test_package_creates_zip_in_correct_location(self): method test_package_zip_name_matches_skill_name (line 140) | def test_package_zip_name_matches_skill_name(self): class TestPackageSkillCLI (line 158) | class TestPackageSkillCLI(unittest.TestCase): method test_cli_help_output (line 161) | def test_cli_help_output(self): method test_cli_executes_without_errors (line 177) | def test_cli_executes_without_errors(self): FILE: tests/test_package_structure.py class TestCliPackage (line 13) | class TestCliPackage: method test_cli_package_exists (line 16) | def test_cli_package_exists(self): method test_cli_has_version (line 22) | def test_cli_has_version(self): method test_cli_has_all (line 29) | def test_cli_has_all(self): method test_llms_txt_detector_import (line 37) | def test_llms_txt_detector_import(self): method test_llms_txt_downloader_import (line 43) | def test_llms_txt_downloader_import(self): method test_llms_txt_parser_import (line 49) | def test_llms_txt_parser_import(self): method test_open_folder_import (line 55) | def test_open_folder_import(self): method test_cli_exports_match_all (line 66) | def test_cli_exports_match_all(self): class TestMcpPackage (line 77) | class TestMcpPackage: method test_mcp_package_exists (line 80) | def test_mcp_package_exists(self): method test_mcp_has_version (line 86) | def test_mcp_has_version(self): method test_mcp_has_all (line 93) | def test_mcp_has_all(self): method test_mcp_tools_package_exists (line 100) | def test_mcp_tools_package_exists(self): method test_mcp_tools_has_version (line 106) | def test_mcp_tools_has_version(self): class TestPackageStructure (line 114) | class TestPackageStructure: method test_cli_init_file_exists (line 117) | def test_cli_init_file_exists(self): method test_mcp_init_file_exists (line 122) | def test_mcp_init_file_exists(self): method test_mcp_tools_init_file_exists (line 127) | def test_mcp_tools_init_file_exists(self): method test_cli_init_has_docstring (line 134) | def test_cli_init_has_docstring(self): method test_mcp_init_has_docstring (line 141) | def test_mcp_init_has_docstring(self): class TestImportPatterns (line 149) | class TestImportPatterns: method test_direct_module_import (line 152) | def test_direct_module_import(self): method test_class_import_from_package (line 160) | def test_class_import_from_package(self): method test_package_level_import (line 168) | def test_package_level_import(self): class TestBackwardsCompatibility (line 176) | class TestBackwardsCompatibility: method test_direct_file_import_still_works (line 179) | def test_direct_file_import_still_works(self): method test_module_path_import_still_works (line 190) | def test_module_path_import_still_works(self): class TestRootPackage (line 201) | class TestRootPackage: method test_root_package_exists (line 204) | def test_root_package_exists(self): method test_root_has_version (line 210) | def test_root_has_version(self): method test_root_has_metadata (line 217) | def test_root_has_metadata(self): class TestCLIEntryPoints (line 226) | class TestCLIEntryPoints: method test_main_cli_module_exists (line 229) | def test_main_cli_module_exists(self): method test_main_cli_has_parser (line 237) | def test_main_cli_has_parser(self): FILE: tests/test_parallel_scraping.py class TestParallelScrapingConfiguration (line 13) | class TestParallelScrapingConfiguration(unittest.TestCase): method setUp (line 16) | def setUp(self): method tearDown (line 20) | def tearDown(self): method test_single_worker_default (line 24) | def test_single_worker_default(self): method test_multiple_workers_creates_lock (line 39) | def test_multiple_workers_creates_lock(self): method test_workers_from_config (line 55) | def test_workers_from_config(self): class TestUnlimitedMode (line 70) | class TestUnlimitedMode(unittest.TestCase): method setUp (line 73) | def setUp(self): method tearDown (line 77) | def tearDown(self): method test_unlimited_with_none (line 81) | def test_unlimited_with_none(self): method test_unlimited_with_minus_one (line 95) | def test_unlimited_with_minus_one(self): method test_limited_mode_default (line 109) | def test_limited_mode_default(self): class TestRateLimiting (line 125) | class TestRateLimiting(unittest.TestCase): method setUp (line 128) | def setUp(self): method tearDown (line 132) | def tearDown(self): method test_rate_limit_from_config (line 136) | def test_rate_limit_from_config(self): method test_rate_limit_default (line 150) | def test_rate_limit_default(self): method test_zero_rate_limit_disables (line 163) | def test_zero_rate_limit_disables(self): class TestThreadSafety (line 178) | class TestThreadSafety(unittest.TestCase): method setUp (line 181) | def setUp(self): method tearDown (line 185) | def tearDown(self): method test_lock_protects_visited_urls (line 189) | def test_lock_protects_visited_urls(self): method test_single_worker_no_lock (line 210) | def test_single_worker_no_lock(self): class TestScrapingModes (line 225) | class TestScrapingModes(unittest.TestCase): method setUp (line 228) | def setUp(self): method tearDown (line 232) | def tearDown(self): method test_single_threaded_limited (line 236) | def test_single_threaded_limited(self): method test_parallel_limited (line 252) | def test_parallel_limited(self): method test_parallel_unlimited (line 269) | def test_parallel_unlimited(self): method test_fast_scraping_mode (line 286) | def test_fast_scraping_mode(self): class TestDryRunWithNewFeatures (line 304) | class TestDryRunWithNewFeatures(unittest.TestCase): method setUp (line 307) | def setUp(self): method tearDown (line 311) | def tearDown(self): method test_dry_run_with_parallel (line 315) | def test_dry_run_with_parallel(self): method test_dry_run_with_unlimited (line 330) | def test_dry_run_with_unlimited(self): FILE: tests/test_parser_sync.py class TestScrapeParserSync (line 11) | class TestScrapeParserSync: method test_scrape_argument_count_matches (line 14) | def test_scrape_argument_count_matches(self): method test_scrape_argument_dests_match (line 33) | def test_scrape_argument_dests_match(self): method test_scrape_specific_arguments_present (line 54) | def test_scrape_specific_arguments_present(self): class TestGitHubParserSync (line 90) | class TestGitHubParserSync: method test_github_argument_count_matches (line 93) | def test_github_argument_count_matches(self): method test_github_argument_dests_match (line 112) | def test_github_argument_dests_match(self): class TestUnifiedCLI (line 134) | class TestUnifiedCLI: method test_main_parser_creates_successfully (line 137) | def test_main_parser_creates_successfully(self): method test_all_subcommands_present (line 144) | def test_all_subcommands_present(self): method test_scrape_help_works (line 164) | def test_scrape_help_works(self): method test_github_help_works (line 177) | def test_github_help_works(self): FILE: tests/test_pattern_recognizer.py class TestSingletonDetector (line 30) | class TestSingletonDetector(unittest.TestCase): method setUp (line 33) | def setUp(self): method test_surface_detection_by_name (line 37) | def test_surface_detection_by_name(self): method test_deep_detection_with_instance_method (line 54) | def test_deep_detection_with_instance_method(self): method test_python_singleton_with_new (line 71) | def test_python_singleton_with_new(self): method test_java_singleton_pattern (line 89) | def test_java_singleton_pattern(self): class TestFactoryDetector (line 112) | class TestFactoryDetector(unittest.TestCase): method setUp (line 115) | def setUp(self): method test_surface_detection_by_name (line 119) | def test_surface_detection_by_name(self): method test_factory_method_detection (line 135) | def test_factory_method_detection(self): method test_abstract_factory_multiple_methods (line 155) | def test_abstract_factory_multiple_methods(self): method test_parameterized_factory (line 175) | def test_parameterized_factory(self): class TestObserverDetector (line 192) | class TestObserverDetector(unittest.TestCase): method setUp (line 195) | def setUp(self): method test_observer_triplet_detection (line 199) | def test_observer_triplet_detection(self): method test_pubsub_pattern (line 227) | def test_pubsub_pattern(self): method test_event_emitter_pattern (line 245) | def test_event_emitter_pattern(self): class TestPatternRecognizerIntegration (line 264) | class TestPatternRecognizerIntegration(unittest.TestCase): method setUp (line 267) | def setUp(self): method test_analyze_singleton_code (line 270) | def test_analyze_singleton_code(self): method test_analyze_factory_code (line 291) | def test_analyze_factory_code(self): method test_analyze_observer_code (line 307) | def test_analyze_observer_code(self): method test_pattern_report_summary (line 329) | def test_pattern_report_summary(self): class TestMultiLanguageSupport (line 353) | class TestMultiLanguageSupport(unittest.TestCase): method setUp (line 356) | def setUp(self): method test_python_patterns (line 359) | def test_python_patterns(self): method test_javascript_patterns (line 377) | def test_javascript_patterns(self): method test_java_patterns (line 401) | def test_java_patterns(self): class TestExtendedPatternDetectors (line 421) | class TestExtendedPatternDetectors(unittest.TestCase): method setUp (line 424) | def setUp(self): method test_builder_pattern (line 427) | def test_builder_pattern(self): method test_adapter_pattern (line 450) | def test_adapter_pattern(self): method test_command_pattern (line 468) | def test_command_pattern(self): class TestLanguageAdapter (line 487) | class TestLanguageAdapter(unittest.TestCase): method test_python_decorator_boost (line 490) | def test_python_decorator_boost(self): method test_javascript_module_pattern (line 505) | def test_javascript_module_pattern(self): method test_no_pattern_returns_none (line 519) | def test_no_pattern_returns_none(self): FILE: tests/test_pdf_advanced_features.py class TestOCRSupport (line 40) | class TestOCRSupport(unittest.TestCase): method setUp (line 43) | def setUp(self): method tearDown (line 51) | def tearDown(self): method test_ocr_initialization (line 55) | def test_ocr_initialization(self): method test_extract_text_with_ocr_disabled (line 61) | def test_extract_text_with_ocr_disabled(self): method test_extract_text_with_ocr_sufficient_text (line 76) | def test_extract_text_with_ocr_sufficient_text(self): method test_ocr_unavailable_warning (line 93) | def test_ocr_unavailable_warning(self): method test_ocr_extraction_triggered (line 111) | def test_ocr_extraction_triggered(self): class TestPasswordProtection (line 136) | class TestPasswordProtection(unittest.TestCase): method setUp (line 139) | def setUp(self): method tearDown (line 147) | def tearDown(self): method test_password_initialization (line 151) | def test_password_initialization(self): method test_encrypted_pdf_detection (line 157) | def test_encrypted_pdf_detection(self): method test_wrong_password_handling (line 179) | def test_wrong_password_handling(self): method test_missing_password_for_encrypted_pdf (line 195) | def test_missing_password_for_encrypted_pdf(self): class TestTableExtraction (line 211) | class TestTableExtraction(unittest.TestCase): method setUp (line 214) | def setUp(self): method tearDown (line 222) | def tearDown(self): method test_table_extraction_initialization (line 226) | def test_table_extraction_initialization(self): method test_table_extraction_disabled (line 232) | def test_table_extraction_disabled(self): method test_table_extraction_basic (line 245) | def test_table_extraction_basic(self): method test_multiple_tables_extraction (line 273) | def test_multiple_tables_extraction(self): method test_table_extraction_error_handling (line 300) | def test_table_extraction_error_handling(self): class TestCaching (line 315) | class TestCaching(unittest.TestCase): method setUp (line 318) | def setUp(self): method tearDown (line 326) | def tearDown(self): method test_cache_initialization (line 330) | def test_cache_initialization(self): method test_cache_set_and_get (line 339) | def test_cache_set_and_get(self): method test_cache_miss (line 354) | def test_cache_miss(self): method test_cache_disabled (line 364) | def test_cache_disabled(self): method test_cache_overwrite (line 380) | def test_cache_overwrite(self): class TestParallelProcessing (line 398) | class TestParallelProcessing(unittest.TestCase): method setUp (line 401) | def setUp(self): method tearDown (line 409) | def tearDown(self): method test_parallel_initialization (line 413) | def test_parallel_initialization(self): method test_parallel_disabled_by_default (line 422) | def test_parallel_disabled_by_default(self): method test_worker_count_auto_detect (line 429) | def test_worker_count_auto_detect(self): method test_custom_worker_count (line 441) | def test_custom_worker_count(self): class TestIntegration (line 449) | class TestIntegration(unittest.TestCase): method setUp (line 452) | def setUp(self): method tearDown (line 460) | def tearDown(self): method test_full_initialization_with_all_features (line 464) | def test_full_initialization_with_all_features(self): method test_feature_combinations (line 485) | def test_feature_combinations(self): method test_page_data_includes_tables (line 503) | def test_page_data_includes_tables(self): FILE: tests/test_pdf_extractor.py class TestLanguageDetection (line 30) | class TestLanguageDetection(unittest.TestCase): method setUp (line 33) | def setUp(self): method test_detect_python_with_confidence (line 40) | def test_detect_python_with_confidence(self): method test_detect_javascript_with_confidence (line 56) | def test_detect_javascript_with_confidence(self): method test_detect_cpp_with_confidence (line 71) | def test_detect_cpp_with_confidence(self): method test_detect_unknown_low_confidence (line 86) | def test_detect_unknown_low_confidence(self): method test_confidence_range (line 101) | def test_confidence_range(self): method test_detect_scss_with_confidence (line 122) | def test_detect_scss_with_confidence(self): method test_detect_dart_with_confidence (line 150) | def test_detect_dart_with_confidence(self): method test_detect_scala_with_confidence (line 174) | def test_detect_scala_with_confidence(self): method test_detect_sass_with_confidence (line 197) | def test_detect_sass_with_confidence(self): method test_detect_elixir_with_confidence (line 222) | def test_detect_elixir_with_confidence(self): method test_detect_lua_with_confidence (line 252) | def test_detect_lua_with_confidence(self): method test_detect_perl_with_confidence (line 277) | def test_detect_perl_with_confidence(self): class TestSyntaxValidation (line 312) | class TestSyntaxValidation(unittest.TestCase): method setUp (line 315) | def setUp(self): method test_validate_python_valid (line 322) | def test_validate_python_valid(self): method test_validate_python_invalid_indentation (line 332) | def test_validate_python_invalid_indentation(self): method test_validate_python_unbalanced_brackets (line 342) | def test_validate_python_unbalanced_brackets(self): method test_validate_javascript_valid (line 352) | def test_validate_javascript_valid(self): method test_validate_natural_language_fails (line 362) | def test_validate_natural_language_fails(self): class TestQualityScoring (line 373) | class TestQualityScoring(unittest.TestCase): method setUp (line 376) | def setUp(self): method test_quality_score_range (line 383) | def test_quality_score_range(self): method test_high_quality_code (line 393) | def test_high_quality_code(self): method test_low_quality_code (line 407) | def test_low_quality_code(self): method test_quality_factors (line 416) | def test_quality_factors(self): class TestChapterDetection (line 431) | class TestChapterDetection(unittest.TestCase): method setUp (line 434) | def setUp(self): method test_detect_chapter_with_number (line 441) | def test_detect_chapter_with_number(self): method test_detect_chapter_uppercase (line 454) | def test_detect_chapter_uppercase(self): method test_detect_section_heading (line 466) | def test_detect_section_heading(self): method test_not_chapter (line 475) | def test_not_chapter(self): class TestCodeBlockMerging (line 488) | class TestCodeBlockMerging(unittest.TestCase): method setUp (line 491) | def setUp(self): method test_merge_continued_blocks (line 498) | def test_merge_continued_blocks(self): method test_no_merge_different_languages (line 534) | def test_no_merge_different_languages(self): class TestCodeDetectionMethods (line 570) | class TestCodeDetectionMethods(unittest.TestCase): method setUp (line 573) | def setUp(self): method test_pattern_based_detection (line 580) | def test_pattern_based_detection(self): method test_indent_based_detection (line 592) | def test_indent_based_detection(self): class TestQualityFiltering (line 604) | class TestQualityFiltering(unittest.TestCase): method setUp (line 607) | def setUp(self): method test_filter_by_min_quality (line 614) | def test_filter_by_min_quality(self): class TestMarkdownExtractionFallback (line 634) | class TestMarkdownExtractionFallback(unittest.TestCase): method test_exception_types_in_fallback (line 637) | def test_exception_types_in_fallback(self): method test_fallback_text_extraction_logic (line 658) | def test_fallback_text_extraction_logic(self): method test_markdown_fallback_on_assertion_error (line 673) | def test_markdown_fallback_on_assertion_error(self): method test_markdown_fallback_on_runtime_error (line 702) | def test_markdown_fallback_on_runtime_error(self): method test_markdown_fallback_on_type_error (line 729) | def test_markdown_fallback_on_type_error(self): method test_markdown_fallback_preserves_content_quality (line 754) | def test_markdown_fallback_preserves_content_quality(self): FILE: tests/test_pdf_scraper.py class TestPDFToSkillConverter (line 28) | class TestPDFToSkillConverter(unittest.TestCase): method setUp (line 31) | def setUp(self): method tearDown (line 42) | def tearDown(self): method test_init_with_name_and_pdf_path (line 47) | def test_init_with_name_and_pdf_path(self): method test_init_with_config (line 55) | def test_init_with_config(self): method test_init_requires_name_or_config (line 70) | def test_init_requires_name_or_config(self): class TestCategorization (line 76) | class TestCategorization(unittest.TestCase): method setUp (line 79) | def setUp(self): method tearDown (line 87) | def tearDown(self): method test_categorize_by_keywords (line 90) | def test_categorize_by_keywords(self): method test_categorize_by_chapters (line 123) | def test_categorize_by_chapters(self): method test_categorize_handles_no_chapters (line 143) | def test_categorize_handles_no_chapters(self): class TestSkillBuilding (line 159) | class TestSkillBuilding(unittest.TestCase): method setUp (line 162) | def setUp(self): method tearDown (line 170) | def tearDown(self): method test_build_skill_creates_structure (line 173) | def test_build_skill_creates_structure(self): method test_build_skill_creates_skill_md (line 199) | def test_build_skill_creates_skill_md(self): method test_build_skill_creates_reference_files (line 223) | def test_build_skill_creates_reference_files(self): class TestCodeBlockHandling (line 248) | class TestCodeBlockHandling(unittest.TestCase): method setUp (line 251) | def setUp(self): method tearDown (line 259) | def tearDown(self): method test_code_blocks_included_in_references (line 262) | def test_code_blocks_included_in_references(self): method test_high_quality_code_preferred (line 300) | def test_high_quality_code_preferred(self): class TestImageHandling (line 338) | class TestImageHandling(unittest.TestCase): method setUp (line 341) | def setUp(self): method tearDown (line 349) | def tearDown(self): method test_images_saved_to_assets (line 352) | def test_images_saved_to_assets(self): method test_image_references_in_markdown (line 391) | def test_image_references_in_markdown(self): class TestErrorHandling (line 432) | class TestErrorHandling(unittest.TestCase): method setUp (line 435) | def setUp(self): method tearDown (line 443) | def tearDown(self): method test_missing_pdf_file (line 446) | def test_missing_pdf_file(self): method test_invalid_config_file (line 454) | def test_invalid_config_file(self): method test_missing_required_config_fields (line 461) | def test_missing_required_config_fields(self): class TestJSONWorkflow (line 470) | class TestJSONWorkflow(unittest.TestCase): method setUp (line 473) | def setUp(self): method tearDown (line 481) | def tearDown(self): method test_load_from_json (line 484) | def test_load_from_json(self): method test_build_from_json_without_extraction (line 503) | def test_build_from_json_without_extraction(self): class TestPDFCLIArguments (line 522) | class TestPDFCLIArguments(unittest.TestCase): method setUp (line 525) | def setUp(self): method test_api_key_stored_correctly (line 534) | def test_api_key_stored_correctly(self): method test_enhance_level_accepted (line 539) | def test_enhance_level_accepted(self): method test_enhance_workflow_accepted (line 544) | def test_enhance_workflow_accepted(self): method test_workflow_dry_run_accepted (line 549) | def test_workflow_dry_run_accepted(self): FILE: tests/test_pinecone_adaptor.py function sample_skill_dir (line 19) | def sample_skill_dir(tmp_path): function sample_skill_dir_no_doc_version (line 51) | def sample_skill_dir_no_doc_version(tmp_path): class TestPineconeAdaptor (line 79) | class TestPineconeAdaptor: method test_import (line 82) | def test_import(self): method test_platform_constants (line 88) | def test_platform_constants(self): method test_registered_in_factory (line 97) | def test_registered_in_factory(self): method test_get_adaptor (line 103) | def test_get_adaptor(self): method test_format_skill_md_structure (line 111) | def test_format_skill_md_structure(self, sample_skill_dir): method test_format_skill_md_vectors_have_metadata (line 133) | def test_format_skill_md_vectors_have_metadata(self, sample_skill_dir): method test_format_skill_md_doc_version_propagates (line 158) | def test_format_skill_md_doc_version_propagates(self, sample_skill_dir): method test_format_skill_md_empty_doc_version (line 174) | def test_format_skill_md_empty_doc_version(self, sample_skill_dir): method test_format_skill_md_has_overview_and_references (line 186) | def test_format_skill_md_has_overview_and_references(self, sample_skil... method test_package_creates_file (line 201) | def test_package_creates_file(self, sample_skill_dir, tmp_path): method test_package_reads_frontmatter_metadata (line 215) | def test_package_reads_frontmatter_metadata(self, sample_skill_dir, tm... method test_package_with_chunking (line 226) | def test_package_with_chunking(self, sample_skill_dir, tmp_path): method test_index_name_derived_from_skill_name (line 239) | def test_index_name_derived_from_skill_name(self, sample_skill_dir, tm... method test_no_values_field_in_vectors (line 250) | def test_no_values_field_in_vectors(self, sample_skill_dir, tmp_path): method test_text_truncation (line 261) | def test_text_truncation(self): method test_validate_api_key_returns_false (line 274) | def test_validate_api_key_returns_false(self): method test_get_env_var_name (line 281) | def test_get_env_var_name(self): method test_supports_enhancement_false (line 288) | def test_supports_enhancement_false(self): method test_upload_without_pinecone_installed (line 295) | def test_upload_without_pinecone_installed(self, tmp_path): method _make_mock_pinecone (line 309) | def _make_mock_pinecone(self, monkeypatch): method _make_package (line 325) | def _make_package(self, tmp_path, vectors=None): method test_upload_success_has_url_key (line 343) | def test_upload_success_has_url_key(self, tmp_path, monkeypatch): method test_embedding_dimension_autodetect_st (line 362) | def test_embedding_dimension_autodetect_st(self, tmp_path, monkeypatch): method test_embedding_dimension_autodetect_openai (line 386) | def test_embedding_dimension_autodetect_openai(self, tmp_path, monkeyp... method test_embedding_before_index_creation (line 409) | def test_embedding_before_index_creation(self, tmp_path, monkeypatch): method test_embedding_dimension_explicit_override (line 427) | def test_embedding_dimension_explicit_override(self, tmp_path, monkeyp... method test_deterministic_ids (line 451) | def test_deterministic_ids(self, sample_skill_dir): class TestDocVersionMetadata (line 474) | class TestDocVersionMetadata: method test_skill_metadata_has_doc_version (line 477) | def test_skill_metadata_has_doc_version(self): method test_skill_metadata_doc_version_default_empty (line 482) | def test_skill_metadata_doc_version_default_empty(self): method test_read_frontmatter (line 487) | def test_read_frontmatter(self, sample_skill_dir): method test_read_frontmatter_missing (line 496) | def test_read_frontmatter_missing(self, sample_skill_dir_no_doc_version): method test_build_skill_metadata_reads_doc_version (line 504) | def test_build_skill_metadata_reads_doc_version(self, sample_skill_dir): method test_build_skill_metadata_no_doc_version (line 513) | def test_build_skill_metadata_no_doc_version(self, sample_skill_dir_no... method test_build_metadata_dict_includes_doc_version (line 521) | def test_build_metadata_dict_includes_doc_version(self): method test_build_metadata_dict_empty_doc_version (line 531) | def test_build_metadata_dict_empty_doc_version(self): method test_doc_version_in_package_output (line 545) | def test_doc_version_in_package_output(self, platform, sample_skill_di... method test_empty_doc_version_in_package_output (line 568) | def test_empty_doc_version_in_package_output( class TestDocVersionQdrant (line 586) | class TestDocVersionQdrant: method test_qdrant_doc_version (line 589) | def test_qdrant_doc_version(self, sample_skill_dir, tmp_path): class TestWeaviateUploadReturnKeys (line 605) | class TestWeaviateUploadReturnKeys: method test_weaviate_upload_success_has_url_key (line 608) | def test_weaviate_upload_success_has_url_key(self, sample_skill_dir, t... class TestDocVersionWeaviate (line 640) | class TestDocVersionWeaviate: method test_weaviate_doc_version (line 643) | def test_weaviate_doc_version(self, sample_skill_dir, tmp_path): method test_weaviate_schema_includes_doc_version (line 658) | def test_weaviate_schema_includes_doc_version(self, sample_skill_dir, ... class TestDocVersionCLIFlag (line 678) | class TestDocVersionCLIFlag: method test_common_arguments_has_doc_version (line 681) | def test_common_arguments_has_doc_version(self): method test_create_arguments_has_doc_version (line 687) | def test_create_arguments_has_doc_version(self): method test_doc_version_flag_parsed (line 693) | def test_doc_version_flag_parsed(self): method test_doc_version_default_empty (line 703) | def test_doc_version_default_empty(self): class TestPineconeInPackageChoices (line 719) | class TestPineconeInPackageChoices: method test_pinecone_in_package_arguments (line 722) | def test_pinecone_in_package_arguments(self): function _extract_metadata_from_package (line 735) | def _extract_metadata_from_package(platform: str, data: dict) -> list[di... FILE: tests/test_preset_system.py class TestPresetDefinitions (line 12) | class TestPresetDefinitions: method test_all_presets_defined (line 15) | def test_all_presets_defined(self): method test_preset_structure (line 22) | def test_preset_structure(self): method test_quick_preset (line 34) | def test_quick_preset(self): method test_standard_preset (line 50) | def test_standard_preset(self): method test_comprehensive_preset (line 67) | def test_comprehensive_preset(self): class TestPresetManager (line 79) | class TestPresetManager: method test_get_preset (line 82) | def test_get_preset(self): method test_get_preset_invalid (line 94) | def test_get_preset_invalid(self): method test_list_presets (line 99) | def test_list_presets(self): method test_format_preset_help (line 107) | def test_format_preset_help(self): method test_get_default_preset (line 118) | def test_get_default_preset(self): class TestPresetApplication (line 124) | class TestPresetApplication: method test_apply_preset_quick (line 127) | def test_apply_preset_quick(self): method test_apply_preset_standard (line 141) | def test_apply_preset_standard(self): method test_apply_preset_comprehensive (line 155) | def test_apply_preset_comprehensive(self): method test_cli_overrides_preset (line 171) | def test_cli_overrides_preset(self): method test_apply_preset_preserves_args (line 187) | def test_apply_preset_preserves_args(self): method test_apply_preset_invalid (line 202) | def test_apply_preset_invalid(self): class TestDeprecationWarnings (line 210) | class TestDeprecationWarnings: method test_check_deprecated_flags_quick (line 213) | def test_check_deprecated_flags_quick(self, capsys): method test_check_deprecated_flags_comprehensive (line 228) | def test_check_deprecated_flags_comprehensive(self, capsys): method test_check_deprecated_flags_depth (line 243) | def test_check_deprecated_flags_depth(self, capsys): method test_check_deprecated_flags_ai_mode (line 258) | def test_check_deprecated_flags_ai_mode(self, capsys): method test_check_deprecated_flags_multiple (line 273) | def test_check_deprecated_flags_multiple(self, capsys): method test_check_deprecated_flags_none (line 290) | def test_check_deprecated_flags_none(self, capsys): class TestBackwardCompatibility (line 304) | class TestBackwardCompatibility: method test_old_flags_still_work (line 307) | def test_old_flags_still_work(self): method test_preset_flag_preferred (line 319) | def test_preset_flag_preferred(self): FILE: tests/test_quality_checker.py class TestQualityChecker (line 13) | class TestQualityChecker(unittest.TestCase): method create_test_skill (line 16) | def create_test_skill(self, tmpdir, skill_md_content, create_reference... method test_checker_detects_missing_skill_md (line 36) | def test_checker_detects_missing_skill_md(self): method test_checker_detects_missing_references (line 49) | def test_checker_detects_missing_references(self): method test_checker_detects_invalid_frontmatter (line 69) | def test_checker_detects_invalid_frontmatter(self): method test_checker_detects_missing_name_field (line 85) | def test_checker_detects_missing_name_field(self): method test_checker_detects_code_without_language (line 103) | def test_checker_detects_code_without_language(self): method test_checker_approves_good_skill (line 127) | def test_checker_approves_good_skill(self): method test_checker_detects_broken_links (line 175) | def test_checker_detects_broken_links(self): method test_quality_score_calculation (line 197) | def test_quality_score_calculation(self): method test_quality_grade_calculation (line 218) | def test_quality_grade_calculation(self): method test_is_excellent_property (line 245) | def test_is_excellent_property(self): class TestCompletenessChecks (line 264) | class TestCompletenessChecks(unittest.TestCase): method create_test_skill (line 267) | def create_test_skill(self, tmpdir, skill_md_content): method test_checker_detects_prerequisites_section (line 283) | def test_checker_detects_prerequisites_section(self): method test_checker_detects_troubleshooting_section (line 316) | def test_checker_detects_troubleshooting_section(self): method test_checker_detects_workflow_steps (line 349) | def test_checker_detects_workflow_steps(self): method test_checker_suggests_adding_prerequisites (line 382) | def test_checker_suggests_adding_prerequisites(self): class TestQualityCheckerCLI (line 410) | class TestQualityCheckerCLI(unittest.TestCase): method test_cli_help_output (line 413) | def test_cli_help_output(self): method test_cli_with_nonexistent_directory (line 431) | def test_cli_with_nonexistent_directory(self): FILE: tests/test_quality_metrics.py function complete_skill_dir (line 26) | def complete_skill_dir(): function minimal_skill_dir (line 48) | def minimal_skill_dir(): function test_completeness_full (line 60) | def test_completeness_full(complete_skill_dir): function test_completeness_minimal (line 68) | def test_completeness_minimal(minimal_skill_dir): function test_accuracy_clean (line 76) | def test_accuracy_clean(): function test_accuracy_with_todos (line 90) | def test_accuracy_with_todos(): function test_accuracy_with_placeholder (line 104) | def test_accuracy_with_placeholder(): function test_coverage_high (line 118) | def test_coverage_high(complete_skill_dir): function test_coverage_low (line 126) | def test_coverage_low(): function test_health_good (line 140) | def test_health_good(): function test_health_empty_files (line 157) | def test_health_empty_files(): function test_calculate_statistics (line 171) | def test_calculate_statistics(complete_skill_dir): function test_overall_score_calculation (line 181) | def test_overall_score_calculation(): function test_grade_assignment (line 206) | def test_grade_assignment(): function test_generate_recommendations (line 225) | def test_generate_recommendations(): function test_generate_report (line 241) | def test_generate_report(complete_skill_dir): function test_format_report (line 253) | def test_format_report(complete_skill_dir): function test_metric_levels (line 268) | def test_metric_levels(): function test_empty_skill_directory (line 283) | def test_empty_skill_directory(): function test_metric_suggestions (line 295) | def test_metric_suggestions(): FILE: tests/test_rag_chunker.py class TestRAGChunker (line 11) | class TestRAGChunker: method test_initialization (line 14) | def test_initialization(self): method test_initialization_custom_params (line 24) | def test_initialization_custom_params(self): method test_estimate_tokens (line 40) | def test_estimate_tokens(self): method test_chunk_document_empty (line 57) | def test_chunk_document_empty(self): method test_chunk_document_simple (line 64) | def test_chunk_document_simple(self): method test_preserve_code_blocks (line 85) | def test_preserve_code_blocks(self): method test_code_block_not_split (line 110) | def test_code_block_not_split(self): method test_semantic_boundaries (line 140) | def test_semantic_boundaries(self): method test_chunk_overlap (line 164) | def test_chunk_overlap(self): method test_chunk_skill_directory (line 175) | def test_chunk_skill_directory(self, tmp_path): method test_save_chunks (line 208) | def test_save_chunks(self, tmp_path): method test_min_chunk_size (line 233) | def test_min_chunk_size(self): method test_extract_code_blocks (line 247) | def test_extract_code_blocks(self): method test_find_semantic_boundaries (line 275) | def test_find_semantic_boundaries(self): method test_real_world_documentation (line 293) | def test_real_world_documentation(self): class TestRAGChunkerIntegration (line 366) | class TestRAGChunkerIntegration: method test_chunk_then_load_with_langchain (line 369) | def test_chunk_then_load_with_langchain(self, tmp_path): method test_chunk_then_load_with_llamaindex (line 397) | def test_chunk_then_load_with_llamaindex(self, tmp_path): FILE: tests/test_rate_limit_handler.py class TestRateLimitHandler (line 20) | class TestRateLimitHandler: method test_create_headers_no_token (line 23) | def test_create_headers_no_token(self): method test_create_headers_with_token (line 28) | def test_create_headers_with_token(self): method test_init_without_token (line 34) | def test_init_without_token(self): method test_init_with_token (line 41) | def test_init_with_token(self): method test_init_with_config_strategy (line 48) | def test_init_with_config_strategy(self, mock_get_config): method test_extract_rate_limit_info (line 67) | def test_extract_rate_limit_info(self): method test_check_upfront_no_token_declined (line 88) | def test_check_upfront_no_token_declined(self, mock_input): method test_check_upfront_no_token_accepted (line 98) | def test_check_upfront_no_token_accepted(self, mock_input): method test_check_upfront_no_token_non_interactive (line 107) | def test_check_upfront_no_token_non_interactive(self): method test_check_upfront_with_token_good_status (line 118) | def test_check_upfront_with_token_good_status(self, mock_get_config, m... method test_check_response_not_rate_limited (line 147) | def test_check_response_not_rate_limited(self): method test_check_response_other_403 (line 158) | def test_check_response_other_403(self): method test_non_interactive_fail_strategy (line 171) | def test_non_interactive_fail_strategy(self, mock_get_config): class TestConfigManagerIntegration (line 194) | class TestConfigManagerIntegration: method test_config_manager_creates_default_config (line 197) | def test_config_manager_creates_default_config(self, tmp_path, monkeyp... method test_add_and_retrieve_github_profile (line 224) | def test_add_and_retrieve_github_profile(self, tmp_path, monkeypatch): method test_get_next_profile (line 257) | def test_get_next_profile(self, tmp_path, monkeypatch): FILE: tests/test_real_world_fastmcp.py class TestRealWorldFastMCP (line 29) | class TestRealWorldFastMCP: method github_token (line 42) | def github_token(self): method output_dir (line 53) | def output_dir(self, tmp_path_factory): method fastmcp_analysis (line 60) | def fastmcp_analysis(self, github_token, output_dir): method test_01_three_streams_present (line 108) | def test_01_three_streams_present(self, fastmcp_analysis): method test_02_c3x_components_populated (line 180) | def test_02_c3x_components_populated(self, fastmcp_analysis): method test_03_router_generation (line 261) | def test_03_router_generation(self, fastmcp_analysis, output_dir): method test_04_quality_metrics (line 376) | def test_04_quality_metrics(self, fastmcp_analysis, output_dir): # no... method test_05_skill_quality_assessment (line 445) | def test_05_skill_quality_assessment(self, output_dir): method test_06_final_report (line 518) | def test_06_final_report(self, fastmcp_analysis, output_dir): FILE: tests/test_scraper_features.py class TestURLValidation (line 19) | class TestURLValidation(unittest.TestCase): method setUp (line 22) | def setUp(self): method test_valid_url_with_include_pattern (line 34) | def test_valid_url_with_include_pattern(self): method test_valid_url_with_api_pattern (line 39) | def test_valid_url_with_api_pattern(self): method test_invalid_url_with_exclude_pattern (line 44) | def test_invalid_url_with_exclude_pattern(self): method test_invalid_url_different_domain (line 49) | def test_invalid_url_different_domain(self): method test_invalid_url_no_include_match (line 54) | def test_invalid_url_no_include_match(self): method test_url_validation_no_patterns (line 59) | def test_url_validation_no_patterns(self): class TestLanguageDetection (line 76) | class TestLanguageDetection(unittest.TestCase): method setUp (line 79) | def setUp(self): method test_detect_language_from_class (line 90) | def test_detect_language_from_class(self): method test_detect_language_from_lang_class (line 97) | def test_detect_language_from_lang_class(self): method test_detect_language_from_parent (line 104) | def test_detect_language_from_parent(self): method test_detect_python_from_heuristics (line 111) | def test_detect_python_from_heuristics(self): method test_detect_python_from_def (line 119) | def test_detect_python_from_def(self): method test_detect_javascript_from_const (line 127) | def test_detect_javascript_from_const(self): method test_detect_javascript_from_arrow (line 135) | def test_detect_javascript_from_arrow(self): method test_detect_gdscript (line 143) | def test_detect_gdscript(self): method test_detect_cpp (line 151) | def test_detect_cpp(self): method test_detect_unknown (line 159) | def test_detect_unknown(self): method test_detect_brush_pattern_in_pre (line 167) | def test_detect_brush_pattern_in_pre(self): method test_detect_bare_class_in_pre (line 174) | def test_detect_bare_class_in_pre(self): method test_detect_bare_class_in_code (line 181) | def test_detect_bare_class_in_code(self): method test_detect_csharp_from_using_system (line 188) | def test_detect_csharp_from_using_system(self): method test_detect_csharp_from_namespace (line 196) | def test_detect_csharp_from_namespace(self): method test_detect_csharp_from_property_syntax (line 204) | def test_detect_csharp_from_property_syntax(self): method test_detect_csharp_from_public_class (line 212) | def test_detect_csharp_from_public_class(self): method test_detect_csharp_from_private_class (line 220) | def test_detect_csharp_from_private_class(self): method test_detect_csharp_from_public_static_void (line 228) | def test_detect_csharp_from_public_static_void(self): method test_detect_csharp_from_class_attribute (line 236) | def test_detect_csharp_from_class_attribute(self): class TestPatternExtraction (line 245) | class TestPatternExtraction(unittest.TestCase): method setUp (line 248) | def setUp(self): method test_extract_pattern_with_example_marker (line 259) | def test_extract_pattern_with_example_marker(self): method test_extract_pattern_with_usage_marker (line 274) | def test_extract_pattern_with_usage_marker(self): method test_extract_pattern_limit (line 289) | def test_extract_pattern_limit(self): class TestCategorization (line 303) | class TestCategorization(unittest.TestCase): method setUp (line 306) | def setUp(self): method test_categorize_by_url (line 322) | def test_categorize_by_url(self): method test_categorize_by_title (line 337) | def test_categorize_by_title(self): method test_categorize_by_content (line 351) | def test_categorize_by_content(self): method test_categorize_to_other (line 365) | def test_categorize_to_other(self): method test_empty_categories_removed (line 379) | def test_empty_categories_removed(self): class TestLinkExtraction (line 396) | class TestLinkExtraction(unittest.TestCase): method setUp (line 399) | def setUp(self): method test_extract_links_strips_anchor_fragments (line 411) | def test_extract_links_strips_anchor_fragments(self): method test_extract_links_no_anchor_duplicates (line 431) | def test_extract_links_no_anchor_duplicates(self): method test_extract_links_preserves_query_params (line 450) | def test_extract_links_preserves_query_params(self): method test_extract_links_relative_urls_with_anchors (line 465) | def test_extract_links_relative_urls_with_anchors(self): class TestTextCleaning (line 484) | class TestTextCleaning(unittest.TestCase): method setUp (line 487) | def setUp(self): method test_clean_multiple_spaces (line 498) | def test_clean_multiple_spaces(self): method test_clean_newlines (line 504) | def test_clean_newlines(self): method test_clean_tabs (line 510) | def test_clean_tabs(self): method test_clean_strip_whitespace (line 516) | def test_clean_strip_whitespace(self): class TestSanitizeUrl (line 523) | class TestSanitizeUrl(unittest.TestCase): method test_no_brackets_unchanged (line 526) | def test_no_brackets_unchanged(self): method test_brackets_in_path_encoded (line 533) | def test_brackets_in_path_encoded(self): method test_brackets_in_query_encoded (line 540) | def test_brackets_in_query_encoded(self): method test_host_not_affected (line 547) | def test_host_not_affected(self): method test_already_encoded_brackets (line 555) | def test_already_encoded_brackets(self): method test_empty_and_simple_urls (line 563) | def test_empty_and_simple_urls(self): class TestEnqueueUrlSanitization (line 572) | class TestEnqueueUrlSanitization(unittest.TestCase): method setUp (line 575) | def setUp(self): method test_enqueue_sanitises_brackets (line 587) | def test_enqueue_sanitises_brackets(self): method test_enqueue_dedup_with_encoded_brackets (line 598) | def test_enqueue_dedup_with_encoded_brackets(self): method test_enqueue_normal_url_unchanged (line 607) | def test_enqueue_normal_url_unchanged(self): class TestMarkdownLinkBracketSanitization (line 615) | class TestMarkdownLinkBracketSanitization(unittest.TestCase): method setUp (line 618) | def setUp(self): method test_extract_markdown_links_with_brackets (line 630) | def test_extract_markdown_links_with_brackets(self): FILE: tests/test_server_fastmcp_http.py class TestFastMCPHTTP (line 29) | class TestFastMCPHTTP: method test_health_check_endpoint (line 32) | def test_health_check_endpoint(self): method test_sse_endpoint_exists (line 75) | def test_sse_endpoint_exists(self): method test_cors_middleware (line 90) | def test_cors_middleware(self): class TestArgumentParsing (line 113) | class TestArgumentParsing: method test_parse_args_default (line 116) | def test_parse_args_default(self): method test_parse_args_http_mode (line 135) | def test_parse_args_http_mode(self): method test_parse_args_log_level (line 151) | def test_parse_args_log_level(self): FILE: tests/test_setup_scripts.py class TestSetupMCPScript (line 15) | class TestSetupMCPScript: method script_path (line 19) | def script_path(self): method script_content (line 24) | def script_content(self, script_path): method test_setup_mcp_exists (line 29) | def test_setup_mcp_exists(self, script_path): method test_bash_syntax_valid (line 34) | def test_bash_syntax_valid(self, script_path): method test_references_correct_mcp_directory (line 39) | def test_references_correct_mcp_directory(self, script_content): method test_requirements_txt_path (line 62) | def test_requirements_txt_path(self, script_content): method test_server_py_path (line 87) | def test_server_py_path(self, script_content): method test_referenced_files_exist (line 102) | def test_referenced_files_exist(self): method test_config_directory_exists (line 114) | def test_config_directory_exists(self): method test_script_is_executable (line 119) | def test_script_is_executable(self, script_path): method test_json_config_path_format (line 125) | def test_json_config_path_format(self, script_content): method test_no_hardcoded_paths (line 134) | def test_no_hardcoded_paths(self, script_content): method test_pytest_command_references (line 140) | def test_pytest_command_references(self, script_content): class TestBashScriptGeneral (line 149) | class TestBashScriptGeneral: method all_bash_scripts (line 153) | def all_bash_scripts(self): method test_all_scripts_have_shebang (line 158) | def test_all_scripts_have_shebang(self, all_bash_scripts): method test_all_scripts_syntax_valid (line 166) | def test_all_scripts_syntax_valid(self, all_bash_scripts): method test_all_scripts_use_set_e (line 172) | def test_all_scripts_use_set_e(self, all_bash_scripts): method test_no_deprecated_backticks (line 183) | def test_no_deprecated_backticks(self, all_bash_scripts): class TestMCPServerPaths (line 197) | class TestMCPServerPaths: method test_github_workflows_reference_correct_paths (line 200) | def test_github_workflows_reference_correct_paths(self): method test_readme_references_correct_paths (line 212) | def test_readme_references_correct_paths(self): method test_documentation_references_correct_paths (line 226) | def test_documentation_references_correct_paths(self): function test_mcp_directory_structure (line 240) | def test_mcp_directory_structure(): FILE: tests/test_skip_llms_txt.py class TestSkipLlmsTxtConfig (line 18) | class TestSkipLlmsTxtConfig(unittest.TestCase): method test_default_skip_llms_txt_is_false (line 21) | def test_default_skip_llms_txt_is_false(self): method test_skip_llms_txt_can_be_set_true (line 32) | def test_skip_llms_txt_can_be_set_true(self): method test_skip_llms_txt_can_be_set_false (line 44) | def test_skip_llms_txt_can_be_set_false(self): class TestSkipLlmsTxtSyncBehavior (line 57) | class TestSkipLlmsTxtSyncBehavior(unittest.TestCase): method test_llms_txt_tried_when_not_skipped (line 60) | def test_llms_txt_tried_when_not_skipped(self): method test_llms_txt_skipped_when_skip_true (line 85) | def test_llms_txt_skipped_when_skip_true(self): method test_llms_txt_skipped_in_dry_run_mode (line 110) | def test_llms_txt_skipped_in_dry_run_mode(self): class TestSkipLlmsTxtAsyncBehavior (line 135) | class TestSkipLlmsTxtAsyncBehavior(unittest.TestCase): method test_async_llms_txt_tried_when_not_skipped (line 138) | def test_async_llms_txt_tried_when_not_skipped(self): method test_async_llms_txt_skipped_when_skip_true (line 164) | def test_async_llms_txt_skipped_when_skip_true(self): class TestSkipLlmsTxtWithRealConfig (line 191) | class TestSkipLlmsTxtWithRealConfig(unittest.TestCase): method test_telegram_bots_config_pattern (line 194) | def test_telegram_bots_config_pattern(self): method test_skip_llms_txt_with_multiple_start_urls (line 216) | def test_skip_llms_txt_with_multiple_start_urls(self): class TestSkipLlmsTxtEdgeCases (line 236) | class TestSkipLlmsTxtEdgeCases(unittest.TestCase): method test_skip_llms_txt_with_int_zero_logs_warning (line 239) | def test_skip_llms_txt_with_int_zero_logs_warning(self): method test_skip_llms_txt_with_int_one_logs_warning (line 253) | def test_skip_llms_txt_with_int_one_logs_warning(self): method test_skip_llms_txt_with_string_logs_warning (line 267) | def test_skip_llms_txt_with_string_logs_warning(self): method test_skip_llms_txt_with_none_logs_warning (line 281) | def test_skip_llms_txt_with_none_logs_warning(self): method test_scraping_proceeds_when_llms_txt_skipped (line 295) | def test_scraping_proceeds_when_llms_txt_skipped(self): FILE: tests/test_smart_summarization.py class TestSmartSummarization (line 13) | class TestSmartSummarization: method test_summarize_reference_basic (line 16) | def test_summarize_reference_basic(self, tmp_path): method test_summarize_preserves_code_blocks (line 55) | def test_summarize_preserves_code_blocks(self, tmp_path): method test_summarize_large_content (line 94) | def test_summarize_large_content(self, tmp_path): method test_create_prompt_without_summarization (line 130) | def test_create_prompt_without_summarization(self, tmp_path): method test_create_prompt_with_summarization (line 153) | def test_create_prompt_with_summarization(self, tmp_path): method test_run_detects_large_skill (line 190) | def test_run_detects_large_skill(self, tmp_path, monkeypatch, capsys): FILE: tests/test_source_detector.py class TestWebDetection (line 17) | class TestWebDetection: method test_detect_full_https_url (line 20) | def test_detect_full_https_url(self): method test_detect_full_http_url (line 27) | def test_detect_full_http_url(self): method test_detect_domain_only (line 33) | def test_detect_domain_only(self): method test_detect_complex_url (line 40) | def test_detect_complex_url(self): method test_suggested_name_removes_www (line 47) | def test_suggested_name_removes_www(self): method test_suggested_name_removes_docs (line 53) | def test_suggested_name_removes_docs(self): class TestGitHubDetection (line 60) | class TestGitHubDetection: method test_detect_owner_repo_format (line 63) | def test_detect_owner_repo_format(self): method test_detect_github_https_url (line 70) | def test_detect_github_https_url(self): method test_detect_github_url_with_git_suffix (line 77) | def test_detect_github_url_with_git_suffix(self): method test_detect_github_url_without_protocol (line 84) | def test_detect_github_url_without_protocol(self): method test_owner_repo_with_dots_and_dashes (line 91) | def test_owner_repo_with_dots_and_dashes(self): class TestLocalDetection (line 99) | class TestLocalDetection: method test_detect_relative_directory (line 102) | def test_detect_relative_directory(self, tmp_path): method test_detect_absolute_directory (line 119) | def test_detect_absolute_directory(self, tmp_path): method test_detect_current_directory (line 130) | def test_detect_current_directory(self): class TestPDFDetection (line 138) | class TestPDFDetection: method test_detect_pdf_extension (line 141) | def test_detect_pdf_extension(self): method test_detect_pdf_with_path (line 148) | def test_detect_pdf_with_path(self): method test_suggested_name_removes_pdf_extension (line 155) | def test_suggested_name_removes_pdf_extension(self): class TestConfigDetection (line 162) | class TestConfigDetection: method test_detect_json_extension (line 165) | def test_detect_json_extension(self): method test_detect_config_with_path (line 172) | def test_detect_config_with_path(self): class TestValidation (line 180) | class TestValidation: method test_validate_existing_directory (line 183) | def test_validate_existing_directory(self, tmp_path): method test_validate_nonexistent_directory (line 192) | def test_validate_nonexistent_directory(self): method test_validate_existing_pdf (line 207) | def test_validate_existing_pdf(self, tmp_path): method test_validate_nonexistent_pdf (line 216) | def test_validate_nonexistent_pdf(self): method test_validate_existing_config (line 227) | def test_validate_existing_config(self, tmp_path): method test_validate_nonexistent_config (line 236) | def test_validate_nonexistent_config(self): class TestAmbiguousCases (line 248) | class TestAmbiguousCases: method test_invalid_input_raises_error (line 251) | def test_invalid_input_raises_error(self): method test_github_takes_precedence_over_web (line 261) | def test_github_takes_precedence_over_web(self): method test_directory_takes_precedence_over_domain (line 268) | def test_directory_takes_precedence_over_domain(self, tmp_path): class TestRawInputPreservation (line 279) | class TestRawInputPreservation: method test_raw_input_preserved_for_web (line 282) | def test_raw_input_preserved_for_web(self): method test_raw_input_preserved_for_github (line 288) | def test_raw_input_preserved_for_github(self): method test_raw_input_preserved_for_local (line 294) | def test_raw_input_preserved_for_local(self, tmp_path): class TestEdgeCases (line 304) | class TestEdgeCases: method test_trailing_slash_in_url (line 307) | def test_trailing_slash_in_url(self): method test_uppercase_in_github_repo (line 315) | def test_uppercase_in_github_repo(self): method test_numbers_in_repo_name (line 321) | def test_numbers_in_repo_name(self): method test_nested_directory_path (line 326) | def test_nested_directory_path(self, tmp_path): FILE: tests/test_source_manager.py function temp_config_dir (line 15) | def temp_config_dir(tmp_path): function source_manager (line 23) | def source_manager(temp_config_dir): class TestSourceManagerInit (line 28) | class TestSourceManagerInit: method test_init_creates_config_dir (line 31) | def test_init_creates_config_dir(self, tmp_path): method test_init_creates_registry_file (line 39) | def test_init_creates_registry_file(self, temp_config_dir): method test_init_preserves_existing_registry (line 51) | def test_init_preserves_existing_registry(self, temp_config_dir): method test_init_with_default_config_dir (line 71) | def test_init_with_default_config_dir(self): class TestAddSource (line 79) | class TestAddSource: method test_add_source_minimal (line 82) | def test_add_source_minimal(self, source_manager): method test_add_source_full_parameters (line 98) | def test_add_source_full_parameters(self, source_manager): method test_add_source_normalizes_name (line 117) | def test_add_source_normalizes_name(self, source_manager): method test_add_source_invalid_name_empty (line 123) | def test_add_source_invalid_name_empty(self, source_manager): method test_add_source_invalid_name_special_chars (line 128) | def test_add_source_invalid_name_special_chars(self, source_manager): method test_add_source_valid_name_with_hyphens (line 135) | def test_add_source_valid_name_with_hyphens(self, source_manager): method test_add_source_valid_name_with_underscores (line 143) | def test_add_source_valid_name_with_underscores(self, source_manager): method test_add_source_empty_git_url (line 151) | def test_add_source_empty_git_url(self, source_manager): method test_add_source_strips_git_url (line 156) | def test_add_source_strips_git_url(self, source_manager): method test_add_source_updates_existing (line 164) | def test_add_source_updates_existing(self, source_manager): method test_add_source_persists_to_file (line 181) | def test_add_source_persists_to_file(self, source_manager, temp_config... method test_add_multiple_sources_sorted_by_priority (line 193) | def test_add_multiple_sources_sorted_by_priority(self, source_manager): class TestGetSource (line 205) | class TestGetSource: method test_get_source_exact_match (line 208) | def test_get_source_exact_match(self, source_manager): method test_get_source_case_insensitive (line 216) | def test_get_source_case_insensitive(self, source_manager): method test_get_source_not_found (line 224) | def test_get_source_not_found(self, source_manager): method test_get_source_not_found_shows_available (line 229) | def test_get_source_not_found_shows_available(self, source_manager): method test_get_source_empty_registry (line 237) | def test_get_source_empty_registry(self, source_manager): class TestListSources (line 243) | class TestListSources: method test_list_sources_empty (line 246) | def test_list_sources_empty(self, source_manager): method test_list_sources_multiple (line 252) | def test_list_sources_multiple(self, source_manager): method test_list_sources_sorted_by_priority (line 262) | def test_list_sources_sorted_by_priority(self, source_manager): method test_list_sources_enabled_only (line 272) | def test_list_sources_enabled_only(self, source_manager): method test_list_sources_all_when_some_disabled (line 290) | def test_list_sources_all_when_some_disabled(self, source_manager): class TestRemoveSource (line 302) | class TestRemoveSource: method test_remove_source_exists (line 305) | def test_remove_source_exists(self, source_manager): method test_remove_source_case_insensitive (line 314) | def test_remove_source_case_insensitive(self, source_manager): method test_remove_source_not_found (line 322) | def test_remove_source_not_found(self, source_manager): method test_remove_source_persists_to_file (line 328) | def test_remove_source_persists_to_file(self, source_manager, temp_con... method test_remove_source_from_multiple (line 343) | def test_remove_source_from_multiple(self, source_manager): class TestUpdateSource (line 356) | class TestUpdateSource: method test_update_source_git_url (line 359) | def test_update_source_git_url(self, source_manager): method test_update_source_branch (line 369) | def test_update_source_branch(self, source_manager): method test_update_source_enabled (line 377) | def test_update_source_enabled(self, source_manager): method test_update_source_priority (line 387) | def test_update_source_priority(self, source_manager): method test_update_source_multiple_fields (line 397) | def test_update_source_multiple_fields(self, source_manager): method test_update_source_updates_timestamp (line 414) | def test_update_source_updates_timestamp(self, source_manager): method test_update_source_not_found (line 423) | def test_update_source_not_found(self, source_manager): method test_update_source_resorts_by_priority (line 428) | def test_update_source_resorts_by_priority(self, source_manager): class TestDefaultTokenEnv (line 441) | class TestDefaultTokenEnv: method test_default_token_env_github (line 444) | def test_default_token_env_github(self, source_manager): method test_default_token_env_gitlab (line 452) | def test_default_token_env_gitlab(self, source_manager): method test_default_token_env_gitea (line 460) | def test_default_token_env_gitea(self, source_manager): method test_default_token_env_bitbucket (line 468) | def test_default_token_env_bitbucket(self, source_manager): method test_default_token_env_custom (line 476) | def test_default_token_env_custom(self, source_manager): method test_override_token_env (line 484) | def test_override_token_env(self, source_manager): class TestRegistryPersistence (line 496) | class TestRegistryPersistence: method test_registry_atomic_write (line 499) | def test_registry_atomic_write(self, source_manager, temp_config_dir): method test_registry_json_formatting (line 507) | def test_registry_json_formatting(self, source_manager, temp_config_dir): method test_registry_corrupted_file (line 520) | def test_registry_corrupted_file(self, temp_config_dir): FILE: tests/test_streaming_ingestion.py function temp_skill_dir (line 25) | def temp_skill_dir(): function test_chunk_document_single_chunk (line 48) | def test_chunk_document_single_chunk(): function test_chunk_document_multiple_chunks (line 66) | def test_chunk_document_multiple_chunks(): function test_chunk_document_metadata (line 87) | def test_chunk_document_metadata(): function test_stream_skill_directory (line 105) | def test_stream_skill_directory(temp_skill_dir): function test_batch_iterator (line 135) | def test_batch_iterator(): function test_progress_tracking (line 151) | def test_progress_tracking(temp_skill_dir): function test_checkpoint_save_load (line 178) | def test_checkpoint_save_load(): function test_format_progress (line 208) | def test_format_progress(): function test_empty_directory (line 229) | def test_empty_directory(): function test_chunk_size_validation (line 243) | def test_chunk_size_validation(): FILE: tests/test_swift_detection.py class TestSwiftCSSClassDetection (line 23) | class TestSwiftCSSClassDetection: method test_language_swift_class (line 26) | def test_language_swift_class(self): method test_lang_swift_class (line 32) | def test_lang_swift_class(self): method test_bare_swift_class (line 38) | def test_bare_swift_class(self): method test_detect_from_html_swift_class (line 44) | def test_detect_from_html_swift_class(self): class TestPureSwiftDetection (line 56) | class TestPureSwiftDetection: method test_func_with_return_type (line 59) | def test_func_with_return_type(self): method test_struct_declaration (line 71) | def test_struct_declaration(self): method test_protocol_declaration (line 84) | def test_protocol_declaration(self): method test_extension_declaration (line 97) | def test_extension_declaration(self): method test_guard_let_unwrapping (line 111) | def test_guard_let_unwrapping(self): method test_if_let_unwrapping (line 126) | def test_if_let_unwrapping(self): method test_closure_syntax (line 138) | def test_closure_syntax(self): method test_error_handling (line 150) | def test_error_handling(self): method test_async_await (line 171) | def test_async_await(self): method test_actor_declaration (line 190) | def test_actor_declaration(self): method test_generics_with_constraints (line 210) | def test_generics_with_constraints(self): method test_enum_with_associated_values (line 225) | def test_enum_with_associated_values(self): method test_opaque_types (line 244) | def test_opaque_types(self): method test_property_observers (line 256) | def test_property_observers(self): method test_memory_management_weak (line 275) | def test_memory_management_weak(self): method test_memory_management_weak_self_in_closure (line 292) | def test_memory_management_weak_self_in_closure(self): method test_memory_management_unowned (line 309) | def test_memory_management_unowned(self): method test_string_interpolation (line 325) | def test_string_interpolation(self): class TestUIKitDetection (line 339) | class TestUIKitDetection: method test_viewcontroller_lifecycle (line 342) | def test_viewcontroller_lifecycle(self): method test_iboutlet_ibaction (line 367) | def test_iboutlet_ibaction(self): method test_tableview_delegate (line 385) | def test_tableview_delegate(self): method test_auto_layout_constraints (line 405) | def test_auto_layout_constraints(self): method test_dispatch_queue (line 423) | def test_dispatch_queue(self): method test_codable_json (line 441) | def test_codable_json(self): class TestAppKitDetection (line 465) | class TestAppKitDetection: method test_nsviewcontroller_lifecycle (line 468) | def test_nsviewcontroller_lifecycle(self): method test_nswindow_controller (line 493) | def test_nswindow_controller(self): method test_nstableview_delegate (line 510) | def test_nstableview_delegate(self): method test_nsapplication_delegate (line 530) | def test_nsapplication_delegate(self): method test_nsmenu_toolbar (line 551) | def test_nsmenu_toolbar(self): method test_nspanel_dialogs (line 568) | def test_nspanel_dialogs(self): method test_nsstatusbar_menubar_extra (line 597) | def test_nsstatusbar_menubar_extra(self): class TestSwiftUIDetection (line 619) | class TestSwiftUIDetection: method test_basic_swiftui_view (line 622) | def test_basic_swiftui_view(self): method test_state_binding (line 638) | def test_state_binding(self): method test_observable_object (line 659) | def test_observable_object(self): method test_environment_object (line 680) | def test_environment_object(self): method test_swiftui_stacks (line 699) | def test_swiftui_stacks(self): method test_swiftui_navigation (line 723) | def test_swiftui_navigation(self): method test_swiftui_modifiers (line 742) | def test_swiftui_modifiers(self): method test_swiftui_list_foreach (line 761) | def test_swiftui_list_foreach(self): method test_swiftui_sheet_alert (line 781) | def test_swiftui_sheet_alert(self): method test_swiftui_macos_window_group (line 804) | def test_swiftui_macos_window_group(self): method test_swiftui_navigation_split_view (line 832) | def test_swiftui_navigation_split_view(self): method test_swift_observation (line 861) | def test_swift_observation(self): class TestCombineDetection (line 888) | class TestCombineDetection: method test_combine_publisher_subscriber (line 891) | def test_combine_publisher_subscriber(self): method test_combine_subjects (line 923) | def test_combine_subjects(self): class TestSwiftConfidenceScoring (line 947) | class TestSwiftConfidenceScoring: method test_minimal_swift_code (line 950) | def test_minimal_swift_code(self): method test_high_confidence_full_app (line 960) | def test_high_confidence_full_app(self): method test_swift_vs_similar_languages (line 1004) | def test_swift_vs_similar_languages(self): class TestSwiftEdgeCases (line 1057) | class TestSwiftEdgeCases: method test_swift_snippet_short (line 1060) | def test_swift_snippet_short(self): method test_swift_import_swiftui_only (line 1068) | def test_swift_import_swiftui_only(self): method test_swift_import_uikit_only (line 1076) | def test_swift_import_uikit_only(self): method test_swift_import_appkit_only (line 1084) | def test_swift_import_appkit_only(self): method test_swift_with_comments (line 1092) | def test_swift_with_comments(self): method test_swift_core_data (line 1110) | def test_swift_core_data(self): method test_swift_data (line 1133) | def test_swift_data(self): class TestFoundationModelsDetection (line 1158) | class TestFoundationModelsDetection: method test_foundation_models_import (line 1161) | def test_foundation_models_import(self): method test_generable_macro (line 1169) | def test_generable_macro(self): method test_language_model_session (line 1186) | def test_language_model_session(self): method test_system_language_model (line 1200) | def test_system_language_model(self): method test_streaming_response (line 1216) | def test_streaming_response(self): method test_guided_generation (line 1229) | def test_guided_generation(self): class TestSwiftErrorHandling (line 1244) | class TestSwiftErrorHandling: method test_pattern_validation_catches_invalid_weight (line 1247) | def test_pattern_validation_catches_invalid_weight(self): method test_pattern_validation_catches_invalid_type (line 1261) | def test_pattern_validation_catches_invalid_type(self): method test_pattern_validation_catches_invalid_tuple_structure (line 1275) | def test_pattern_validation_catches_invalid_tuple_structure(self): method test_malformed_regex_patterns_are_skipped (line 1289) | def test_malformed_regex_patterns_are_skipped(self): method test_empty_swift_patterns_handled_gracefully (line 1323) | def test_empty_swift_patterns_handled_gracefully(self): method test_non_string_pattern_handled_during_compilation (line 1379) | def test_non_string_pattern_handled_during_compilation(self): method test_swift_validation_error_disables_detection (line 1408) | def test_swift_validation_error_disables_detection(self): FILE: tests/test_sync_config.py class TestDiffUrls (line 35) | class TestDiffUrls(unittest.TestCase): method test_no_changes (line 38) | def test_no_changes(self): method test_added_urls (line 45) | def test_added_urls(self): method test_removed_urls (line 52) | def test_removed_urls(self): method test_both_added_and_removed (line 59) | def test_both_added_and_removed(self): method test_empty_configured (line 66) | def test_empty_configured(self): method test_empty_discovered (line 71) | def test_empty_discovered(self): method test_results_sorted (line 76) | def test_results_sorted(self): class TestIsValidUrl (line 88) | class TestIsValidUrl(unittest.TestCase): method test_url_under_base (line 91) | def test_url_under_base(self): method test_url_not_under_base (line 96) | def test_url_not_under_base(self): method test_include_pattern_match (line 101) | def test_include_pattern_match(self): method test_include_pattern_no_match (line 111) | def test_include_pattern_no_match(self): method test_exclude_pattern (line 121) | def test_exclude_pattern(self): method test_include_and_exclude (line 131) | def test_include_and_exclude(self): method test_no_patterns_all_valid (line 142) | def test_no_patterns_all_valid(self): class TestConfigHelpers (line 153) | class TestConfigHelpers(unittest.TestCase): method test_unified_format (line 156) | def test_unified_format(self): method test_unified_format_second_source (line 168) | def test_unified_format_second_source(self): method test_unified_format_invalid_index (line 179) | def test_unified_format_invalid_index(self): method test_legacy_flat_format (line 183) | def test_legacy_flat_format(self): method test_no_source_found (line 188) | def test_no_source_found(self): method test_set_start_urls_unified (line 192) | def test_set_start_urls_unified(self): method test_set_start_urls_legacy (line 201) | def test_set_start_urls_legacy(self): class TestDiscoverUrls (line 212) | class TestDiscoverUrls(unittest.TestCase): method _make_html (line 215) | def _make_html(self, links: list[str]) -> str: method test_basic_discovery (line 220) | def test_basic_discovery(self, mock_get): method test_depth_limiting (line 246) | def test_depth_limiting(self, mock_get): method test_max_pages_limit (line 269) | def test_max_pages_limit(self, mock_get): method test_include_exclude_patterns (line 288) | def test_include_exclude_patterns(self, mock_get): method test_http_error_handled_gracefully (line 315) | def test_http_error_handled_gracefully(self, mock_get): method test_fragments_stripped (line 331) | def test_fragments_stripped(self, mock_get): class TestSyncConfigIntegration (line 359) | class TestSyncConfigIntegration(unittest.TestCase): method _write_config (line 362) | def _write_config(self, config: dict) -> Path: method test_dry_run_does_not_modify_file (line 369) | def test_dry_run_does_not_modify_file(self, mock_discover): method test_apply_writes_updated_urls (line 399) | def test_apply_writes_updated_urls(self, mock_discover): method test_no_changes_does_not_write (line 432) | def test_no_changes_does_not_write(self, mock_discover): method test_missing_source_returns_error (line 454) | def test_missing_source_returns_error(self): method test_legacy_config_format (line 463) | def test_legacy_config_format(self, mock_discover): method test_nav_seed_urls_used_over_start_urls (line 483) | def test_nav_seed_urls_used_over_start_urls(self, mock_discover): class TestSyncConfigCLI (line 519) | class TestSyncConfigCLI(unittest.TestCase): method test_sync_config_parser_registered (line 522) | def test_sync_config_parser_registered(self): method test_sync_config_in_command_modules (line 528) | def test_sync_config_in_command_modules(self): method test_arguments_created (line 534) | def test_arguments_created(self): method test_default_values (line 548) | def test_default_values(self): class TestSyncConfigMCPTool (line 570) | class TestSyncConfigMCPTool(unittest.TestCase): method test_mcp_tool_importable (line 573) | def test_mcp_tool_importable(self): method test_mcp_tool_missing_config_path (line 579) | def test_mcp_tool_missing_config_path(self): FILE: tests/test_sync_config_e2e.py class _TestHandler (line 97) | class _TestHandler(SimpleHTTPRequestHandler): method do_GET (line 100) | def do_GET(self): method log_message (line 111) | def log_message(self, format, *args): # noqa: ARG002 function _start_server (line 115) | def _start_server() -> tuple[HTTPServer, int]: function _write_config (line 129) | def _write_config(config: dict) -> Path: class TestSyncConfigE2E (line 143) | class TestSyncConfigE2E(unittest.TestCase): method setUpClass (line 147) | def setUpClass(cls): method tearDownClass (line 152) | def tearDownClass(cls): method test_discover_finds_all_doc_pages (line 157) | def test_discover_finds_all_doc_pages(self): method test_discover_excludes_blog (line 169) | def test_discover_excludes_blog(self): method test_discover_excludes_external (line 181) | def test_discover_excludes_external(self): method test_discover_depth_1_finds_direct_links_only (line 195) | def test_discover_depth_1_finds_direct_links_only(self): method test_discover_with_include_pattern (line 213) | def test_discover_with_include_pattern(self): method test_discover_with_exclude_pattern (line 227) | def test_discover_with_exclude_pattern(self): method test_discover_max_pages_limit (line 242) | def test_discover_max_pages_limit(self): method test_sync_config_dry_run_detects_new_pages (line 256) | def test_sync_config_dry_run_detects_new_pages(self): method test_sync_config_apply_updates_config (line 287) | def test_sync_config_apply_updates_config(self): method test_sync_config_idempotent (line 318) | def test_sync_config_idempotent(self): method test_sync_config_detects_removed_pages (line 345) | def test_sync_config_detects_removed_pages(self): method test_sync_config_preserves_other_config_fields (line 370) | def test_sync_config_preserves_other_config_fields(self): method test_sync_config_with_nav_seed_urls (line 413) | def test_sync_config_with_nav_seed_urls(self): method test_sync_config_legacy_format (line 439) | def test_sync_config_legacy_format(self): class TestSyncConfigCLIE2E (line 465) | class TestSyncConfigCLIE2E(unittest.TestCase): method setUpClass (line 469) | def setUpClass(cls): method tearDownClass (line 474) | def tearDownClass(cls): method test_cli_dry_run (line 477) | def test_cli_dry_run(self): method test_cli_apply (line 517) | def test_cli_apply(self): method test_cli_help (line 558) | def test_cli_help(self): method test_cli_missing_config_exits_nonzero (line 573) | def test_cli_missing_config_exits_nonzero(self): class TestSyncConfigRealSite (line 597) | class TestSyncConfigRealSite(unittest.TestCase): method test_discover_urls_real_http (line 604) | def test_discover_urls_real_http(self): FILE: tests/test_terminal_detection.py class TestDetectTerminalApp (line 17) | class TestDetectTerminalApp(unittest.TestCase): method setUp (line 23) | def setUp(self): method tearDown (line 28) | def tearDown(self): method test_detect_terminal_with_skill_seeker_env (line 44) | def test_detect_terminal_with_skill_seeker_env(self): method test_detect_terminal_with_term_program_known (line 53) | def test_detect_terminal_with_term_program_known(self): method test_detect_terminal_with_term_program_ghostty (line 66) | def test_detect_terminal_with_term_program_ghostty(self): method test_detect_terminal_with_term_program_apple_terminal (line 78) | def test_detect_terminal_with_term_program_apple_terminal(self): method test_detect_terminal_with_term_program_wezterm (line 90) | def test_detect_terminal_with_term_program_wezterm(self): method test_detect_terminal_with_term_program_unknown (line 102) | def test_detect_terminal_with_term_program_unknown(self): method test_detect_terminal_default_fallback (line 114) | def test_detect_terminal_default_fallback(self): method test_detect_terminal_priority_order (line 127) | def test_detect_terminal_priority_order(self): method test_subprocess_popen_called_with_correct_args (line 140) | def test_subprocess_popen_called_with_correct_args(self, mock_popen): method test_detect_terminal_whitespace_handling (line 180) | def test_detect_terminal_whitespace_handling(self): method test_detect_terminal_empty_string_env_vars (line 189) | def test_detect_terminal_empty_string_env_vars(self): method test_detect_terminal_empty_string_both_vars (line 200) | def test_detect_terminal_empty_string_both_vars(self): method test_terminal_launch_error_handling (line 214) | def test_terminal_launch_error_handling(self, mock_popen): method test_output_message_unknown_terminal (line 252) | def test_output_message_unknown_terminal(self): class TestTerminalMapCompleteness (line 295) | class TestTerminalMapCompleteness(unittest.TestCase): method test_terminal_map_has_all_documented_terminals (line 298) | def test_terminal_map_has_all_documented_terminals(self): FILE: tests/test_test_example_extractor.py class TestPythonTestAnalyzer (line 34) | class TestPythonTestAnalyzer(unittest.TestCase): method setUp (line 37) | def setUp(self): method test_extract_instantiation (line 40) | def test_extract_instantiation(self): method test_extract_method_call_with_assertion (line 62) | def test_extract_method_call_with_assertion(self): method test_extract_config_dict (line 85) | def test_extract_config_dict(self): method test_extract_setup_code (line 110) | def test_extract_setup_code(self): method test_extract_pytest_fixtures (line 134) | def test_extract_pytest_fixtures(self): method test_filter_trivial_tests (line 163) | def test_filter_trivial_tests(self): method test_integration_workflow (line 177) | def test_integration_workflow(self): method test_confidence_scoring (line 209) | def test_confidence_scoring(self): class TestGenericTestAnalyzer (line 241) | class TestGenericTestAnalyzer(unittest.TestCase): method setUp (line 244) | def setUp(self): method test_extract_javascript_instantiation (line 247) | def test_extract_javascript_instantiation(self): method test_extract_go_table_tests (line 266) | def test_extract_go_table_tests(self): method test_extract_rust_assertions (line 291) | def test_extract_rust_assertions(self): method test_extract_csharp_nunit_tests (line 311) | def test_extract_csharp_nunit_tests(self): method test_extract_csharp_with_mocks (line 367) | def test_extract_csharp_with_mocks(self): method test_extract_gdscript_gut_tests (line 386) | def test_extract_gdscript_gut_tests(self): method test_language_fallback (line 445) | def test_language_fallback(self): class TestExampleQualityFilter (line 458) | class TestExampleQualityFilter(unittest.TestCase): method setUp (line 461) | def setUp(self): method test_confidence_threshold (line 464) | def test_confidence_threshold(self): method test_trivial_pattern_filtering (line 507) | def test_trivial_pattern_filtering(self): method test_minimum_code_length (line 550) | def test_minimum_code_length(self): class TestTestExampleExtractor (line 594) | class TestTestExampleExtractor(unittest.TestCase): method setUp (line 597) | def setUp(self): method tearDown (line 601) | def tearDown(self): method test_extract_from_directory (line 604) | def test_extract_from_directory(self): method test_language_filtering (line 622) | def test_language_filtering(self): method test_max_examples_limit (line 649) | def test_max_examples_limit(self): method test_end_to_end_workflow (line 670) | def test_end_to_end_workflow(self): FILE: tests/test_unified.py function test_detect_unified_format (line 29) | def test_detect_unified_format(): function test_validate_unified_sources (line 69) | def test_validate_unified_sources(): function test_validate_invalid_source_type (line 86) | def test_validate_invalid_source_type(): function test_needs_api_merge (line 99) | def test_needs_api_merge(): function test_backward_compatibility (line 125) | def test_backward_compatibility(): function test_detect_missing_in_docs (line 152) | def test_detect_missing_in_docs(): function test_detect_missing_in_code (line 193) | def test_detect_missing_in_code(): function test_detect_signature_mismatch (line 220) | def test_detect_signature_mismatch(): function test_conflict_severity (line 264) | def test_conflict_severity(): function test_rule_based_merge_docs_only (line 294) | def test_rule_based_merge_docs_only(): function test_rule_based_merge_code_only (line 324) | def test_rule_based_merge_code_only(): function test_rule_based_merge_matched (line 355) | def test_rule_based_merge_matched(): function test_merge_summary (line 399) | def test_merge_summary(): function test_skill_builder_basic (line 438) | def test_skill_builder_basic(): function test_skill_builder_with_conflicts (line 464) | def test_skill_builder_with_conflicts(): function test_skill_builder_merged_apis (line 501) | def test_skill_builder_merged_apis(): function test_full_workflow_unified_config (line 534) | def test_full_workflow_unified_config(): function test_config_file_validation (line 559) | def test_config_file_validation(): class TestUnifiedCLIArguments (line 582) | class TestUnifiedCLIArguments: method parser (line 586) | def parser(self): method test_api_key_stored_correctly (line 594) | def test_api_key_stored_correctly(self, parser): method test_enhance_level_stored_correctly (line 599) | def test_enhance_level_stored_correctly(self, parser): method test_enhance_level_default_is_none (line 604) | def test_enhance_level_default_is_none(self, parser): method test_enhance_level_all_choices (line 609) | def test_enhance_level_all_choices(self, parser): method test_enhance_workflow_accepted (line 617) | def test_enhance_workflow_accepted(self, parser): method test_api_key_and_enhance_level_combined (line 624) | def test_api_key_and_enhance_level_combined(self, parser): class TestWorkflowJsonConfig (line 638) | class TestWorkflowJsonConfig: method _make_scraper (line 641) | def _make_scraper(self, tmp_path, extra_config=None): method test_json_workflows_merged_when_args_none (line 658) | def test_json_workflows_merged_when_args_none(self, tmp_path, monkeypa... method test_json_workflows_appended_after_cli (line 686) | def test_json_workflows_appended_after_cli(self, tmp_path): method test_json_workflow_stages_merged (line 714) | def test_json_workflow_stages_merged(self, tmp_path): method test_json_workflow_vars_converted_to_kv_strings (line 730) | def test_json_workflow_vars_converted_to_kv_strings(self, tmp_path): method test_config_validator_accepts_workflow_fields (line 746) | def test_config_validator_accepts_workflow_fields(self, tmp_path): method test_empty_workflow_config_no_effect (line 762) | def test_empty_workflow_config_no_effect(self, tmp_path): FILE: tests/test_unified_analyzer.py class TestAnalysisResult (line 28) | class TestAnalysisResult: method test_analysis_result_basic (line 31) | def test_analysis_result_basic(self): method test_analysis_result_with_github (line 42) | def test_analysis_result_with_github(self): class TestURLDetection (line 56) | class TestURLDetection: method test_is_github_url_https (line 59) | def test_is_github_url_https(self): method test_is_github_url_ssh (line 64) | def test_is_github_url_ssh(self): method test_is_github_url_local_path (line 69) | def test_is_github_url_local_path(self): method test_is_github_url_other_git (line 75) | def test_is_github_url_other_git(self): class TestBasicAnalysis (line 81) | class TestBasicAnalysis: method test_basic_analysis_local (line 84) | def test_basic_analysis_local(self, tmp_path): method test_list_files (line 99) | def test_list_files(self, tmp_path): method test_get_directory_structure (line 115) | def test_get_directory_structure(self, tmp_path): method test_extract_imports_python (line 133) | def test_extract_imports_python(self, tmp_path): method test_extract_imports_javascript (line 153) | def test_extract_imports_javascript(self, tmp_path): method test_find_entry_points (line 170) | def test_find_entry_points(self, tmp_path): method test_compute_statistics (line 183) | def test_compute_statistics(self, tmp_path): class TestC3xAnalysis (line 200) | class TestC3xAnalysis: method test_c3x_analysis_local (line 203) | def test_c3x_analysis_local(self, tmp_path): method test_c3x_includes_basic_analysis (line 229) | def test_c3x_includes_basic_analysis(self, tmp_path): class TestGitHubAnalysis (line 244) | class TestGitHubAnalysis: method test_analyze_github_basic (line 248) | def test_analyze_github_basic(self, mock_fetcher_class, tmp_path): method test_analyze_github_c3x (line 279) | def test_analyze_github_c3x(self, mock_fetcher_class, tmp_path): method test_analyze_github_without_metadata (line 302) | def test_analyze_github_without_metadata(self, mock_fetcher_class, tmp... class TestErrorHandling (line 327) | class TestErrorHandling: method test_invalid_depth_mode (line 330) | def test_invalid_depth_mode(self, tmp_path): method test_nonexistent_directory (line 338) | def test_nonexistent_directory(self): method test_file_instead_of_directory (line 344) | def test_file_instead_of_directory(self, tmp_path): class TestTokenHandling (line 354) | class TestTokenHandling: method test_github_token_from_env (line 359) | def test_github_token_from_env(self, mock_fetcher_class, tmp_path): method test_github_token_explicit (line 383) | def test_github_token_explicit(self, mock_fetcher_class, tmp_path): class TestIntegration (line 406) | class TestIntegration: method test_local_to_github_consistency (line 409) | def test_local_to_github_consistency(self, tmp_path): FILE: tests/test_unified_mcp_integration.py function test_mcp_validate_unified_config (line 42) | async def test_mcp_validate_unified_config(): function test_mcp_validate_legacy_config (line 66) | async def test_mcp_validate_legacy_config(): function test_mcp_scrape_docs_detection (line 97) | async def test_mcp_scrape_docs_detection(): function test_mcp_merge_mode_override (line 156) | async def test_mcp_merge_mode_override(): function run_all_tests (line 188) | async def run_all_tests(): FILE: tests/test_unified_parsers.py class TestRstParser (line 24) | class TestRstParser: method rst_content (line 28) | def rst_content(self): method parsed_doc (line 119) | def parsed_doc(self, rst_content): method test_parsing_success (line 125) | def test_parsing_success(self, parsed_doc): method test_title_extraction (line 130) | def test_title_extraction(self, parsed_doc): method test_headings_count (line 134) | def test_headings_count(self, parsed_doc): method test_heading_levels (line 138) | def test_heading_levels(self, parsed_doc): method test_tables_count (line 145) | def test_tables_count(self, parsed_doc): method test_table_headers (line 149) | def test_table_headers(self, parsed_doc): method test_table_rows (line 159) | def test_table_rows(self, parsed_doc): method test_code_blocks_count (line 164) | def test_code_blocks_count(self, parsed_doc): method test_code_block_language (line 168) | def test_code_block_language(self, parsed_doc): method test_code_block_quality (line 173) | def test_code_block_quality(self, parsed_doc): method test_cross_references (line 179) | def test_cross_references(self, parsed_doc): method test_cross_reference_types (line 183) | def test_cross_reference_types(self, parsed_doc): method test_admonitions (line 190) | def test_admonitions(self, parsed_doc): method test_field_lists (line 195) | def test_field_lists(self, parsed_doc): method test_substitutions (line 199) | def test_substitutions(self, parsed_doc): method test_to_markdown (line 205) | def test_to_markdown(self, parsed_doc): method test_to_skill_format (line 211) | def test_to_skill_format(self, parsed_doc): class TestMarkdownParser (line 220) | class TestMarkdownParser: method md_content (line 224) | def md_content(self): method parsed_doc (line 277) | def parsed_doc(self, md_content): method test_parsing_success (line 283) | def test_parsing_success(self, parsed_doc): method test_frontmatter_metadata (line 288) | def test_frontmatter_metadata(self, parsed_doc): method test_title_from_frontmatter (line 293) | def test_title_from_frontmatter(self, parsed_doc): method test_headings_count (line 297) | def test_headings_count(self, parsed_doc): method test_heading_levels (line 301) | def test_heading_levels(self, parsed_doc): method test_tables_count (line 306) | def test_tables_count(self, parsed_doc): method test_table_structure (line 310) | def test_table_structure(self, parsed_doc): method test_code_blocks_count (line 319) | def test_code_blocks_count(self, parsed_doc): method test_code_block_language (line 323) | def test_code_block_language(self, parsed_doc): method test_code_block_quality (line 328) | def test_code_block_quality(self, parsed_doc): method test_admonitions (line 334) | def test_admonitions(self, parsed_doc): method test_images_count (line 339) | def test_images_count(self, parsed_doc): method test_image_source (line 343) | def test_image_source(self, parsed_doc): method test_external_links (line 347) | def test_external_links(self, parsed_doc): class TestAutoDetection (line 353) | class TestAutoDetection: method test_rst_detection (line 356) | def test_rst_detection(self): method test_markdown_detection (line 372) | def test_markdown_detection(self): class TestQualityScorer (line 388) | class TestQualityScorer: method test_good_python_code_score (line 391) | def test_good_python_code_score(self): method test_empty_code_score (line 407) | def test_empty_code_score(self): method test_good_table_score (line 415) | def test_good_table_score(self): method test_language_detection (line 428) | def test_language_detection(self): FILE: tests/test_unified_scraper_orchestration.py function _make_scraper (line 25) | def _make_scraper(extra_config=None, tmp_path=None): class TestScrapeAllSourcesRouting (line 75) | class TestScrapeAllSourcesRouting: method _run_with_sources (line 78) | def _run_with_sources(self, sources, monkeypatch): method test_documentation_source_routes_to_scrape_documentation (line 103) | def test_documentation_source_routes_to_scrape_documentation(self, mon... method test_github_source_routes_to_scrape_github (line 112) | def test_github_source_routes_to_scrape_github(self, monkeypatch): method test_pdf_source_routes_to_scrape_pdf (line 117) | def test_pdf_source_routes_to_scrape_pdf(self, monkeypatch): method test_local_source_routes_to_scrape_local (line 122) | def test_local_source_routes_to_scrape_local(self, monkeypatch): method test_unknown_source_type_is_skipped (line 127) | def test_unknown_source_type_is_skipped(self, monkeypatch): method test_multiple_sources_each_scraper_called_once (line 132) | def test_multiple_sources_each_scraper_called_once(self, monkeypatch): method test_exception_in_one_source_continues_others (line 142) | def test_exception_in_one_source_continues_others(self, monkeypatch): class TestScrapeDocumentation (line 170) | class TestScrapeDocumentation: method test_subprocess_called_with_config_and_fresh_flag (line 173) | def test_subprocess_called_with_config_and_fresh_flag(self, tmp_path): method test_nothing_appended_on_subprocess_failure (line 187) | def test_nothing_appended_on_subprocess_failure(self, tmp_path): method test_llms_txt_url_forwarded_to_doc_config (line 198) | def test_llms_txt_url_forwarded_to_doc_config(self, tmp_path): method test_start_urls_forwarded_to_doc_config (line 229) | def test_start_urls_forwarded_to_doc_config(self, tmp_path): class TestScrapeGithub (line 258) | class TestScrapeGithub: method _mock_github_scraper (line 261) | def _mock_github_scraper(self, monkeypatch, github_data=None): method test_github_scraper_instantiated_with_repo (line 277) | def test_github_scraper_instantiated_with_repo(self, tmp_path, monkeyp... method test_scrape_method_called (line 295) | def test_scrape_method_called(self, tmp_path, monkeypatch): method test_scraped_data_appended (line 306) | def test_scraped_data_appended(self, tmp_path, monkeypatch): method test_source_counter_incremented (line 321) | def test_source_counter_incremented(self, tmp_path, monkeypatch): method test_c3_analysis_not_triggered_when_disabled (line 333) | def test_c3_analysis_not_triggered_when_disabled(self, tmp_path, monke... class TestScrapePdf (line 353) | class TestScrapePdf: method _mock_pdf_converter (line 356) | def _mock_pdf_converter(self, monkeypatch, tmp_path, pages=None): method test_pdf_converter_instantiated_with_path (line 376) | def test_pdf_converter_instantiated_with_path(self, tmp_path, monkeypa... method test_extract_pdf_called (line 390) | def test_extract_pdf_called(self, tmp_path, monkeypatch): method test_scraped_data_appended_with_pages (line 401) | def test_scraped_data_appended_with_pages(self, tmp_path, monkeypatch): method test_source_counter_incremented (line 417) | def test_source_counter_incremented(self, tmp_path, monkeypatch): class TestScrapeLocal (line 435) | class TestScrapeLocal: method test_source_counter_incremented (line 438) | def test_source_counter_incremented(self, tmp_path, monkeypatch): method test_enhance_level_uses_cli_args_override (line 453) | def test_enhance_level_uses_cli_args_override(self, tmp_path, monkeypa... class TestRunOrchestration (line 481) | class TestRunOrchestration: method _make_run_scraper (line 484) | def _make_run_scraper(self, extra_config=None): method test_four_phases_called (line 493) | def test_four_phases_called(self): method test_merge_sources_skipped_when_no_conflicts (line 504) | def test_merge_sources_skipped_when_no_conflicts(self): method test_merge_sources_called_when_conflicts_present (line 513) | def test_merge_sources_called_when_conflicts_present(self): method test_workflow_not_called_without_args_and_no_json_workflows (line 523) | def test_workflow_not_called_without_args_and_no_json_workflows(self): method test_workflow_called_when_args_provided (line 532) | def test_workflow_called_when_args_provided(self): method test_workflow_called_for_json_config_workflows (line 551) | def test_workflow_called_for_json_config_workflows(self): FILE: tests/test_upload_integration.py function sample_chroma_package (line 16) | def sample_chroma_package(tmp_path): function sample_weaviate_package (line 35) | def sample_weaviate_package(tmp_path): class TestChromaUploadBasics (line 70) | class TestChromaUploadBasics: method test_chroma_adaptor_exists (line 73) | def test_chroma_adaptor_exists(self): method test_chroma_upload_without_chromadb_installed (line 79) | def test_chroma_upload_without_chromadb_installed(self, sample_chroma_... method test_chroma_upload_api_signature (line 100) | def test_chroma_upload_api_signature(self, sample_chroma_package): class TestWeaviateUploadBasics (line 112) | class TestWeaviateUploadBasics: method test_weaviate_adaptor_exists (line 115) | def test_weaviate_adaptor_exists(self): method test_weaviate_upload_without_weaviate_installed (line 121) | def test_weaviate_upload_without_weaviate_installed(self, sample_weavi... method test_weaviate_upload_api_signature (line 142) | def test_weaviate_upload_api_signature(self, sample_weaviate_package): class TestEmbeddingMethodInheritance (line 154) | class TestEmbeddingMethodInheritance: method test_chroma_inherits_openai_embeddings (line 157) | def test_chroma_inherits_openai_embeddings(self): method test_weaviate_inherits_both_embedding_methods (line 168) | def test_weaviate_inherits_both_embedding_methods(self): method test_pinecone_inherits_both_embedding_methods (line 180) | def test_pinecone_inherits_both_embedding_methods(self): class TestPackageStructure (line 193) | class TestPackageStructure: method test_chroma_package_structure (line 196) | def test_chroma_package_structure(self, sample_chroma_package): method test_weaviate_package_structure (line 207) | def test_weaviate_package_structure(self, sample_weaviate_package): class TestUploadCommandIntegration (line 227) | class TestUploadCommandIntegration: method test_upload_skill_api_signature (line 230) | def test_upload_skill_api_signature(self): method test_upload_command_supports_chroma (line 247) | def test_upload_command_supports_chroma(self): method test_upload_command_supports_weaviate (line 254) | def test_upload_command_supports_weaviate(self): class TestErrorHandling (line 262) | class TestErrorHandling: method test_chroma_handles_missing_file (line 265) | def test_chroma_handles_missing_file(self, tmp_path): method test_weaviate_handles_missing_file (line 280) | def test_weaviate_handles_missing_file(self, tmp_path): method test_chroma_handles_invalid_json (line 295) | def test_chroma_handles_invalid_json(self, tmp_path): method test_weaviate_handles_invalid_json (line 311) | def test_weaviate_handles_invalid_json(self, tmp_path): FILE: tests/test_upload_skill.py class TestUploadSkillAPI (line 15) | class TestUploadSkillAPI(unittest.TestCase): method setUp (line 18) | def setUp(self): method tearDown (line 22) | def tearDown(self): method create_test_zip (line 29) | def create_test_zip(self, tmpdir): method test_upload_without_api_key (line 39) | def test_upload_without_api_key(self): method test_upload_with_nonexistent_file (line 54) | def test_upload_with_nonexistent_file(self): method test_upload_with_invalid_zip (line 63) | def test_upload_with_invalid_zip(self): method test_upload_accepts_path_object (line 79) | def test_upload_accepts_path_object(self): class TestUploadSkillCLI (line 93) | class TestUploadSkillCLI(unittest.TestCase): method test_cli_help_output (line 96) | def test_cli_help_output(self): method test_cli_executes_without_errors (line 112) | def test_cli_executes_without_errors(self): method test_cli_requires_zip_argument (line 126) | def test_cli_requires_zip_argument(self): FILE: tests/test_url_conversion.py class TestConvertToMdUrls (line 11) | class TestConvertToMdUrls(unittest.TestCase): method setUp (line 14) | def setUp(self): method test_strips_anchor_fragments (line 24) | def test_strips_anchor_fragments(self): method test_deduplicates_multiple_anchors_same_url (line 40) | def test_deduplicates_multiple_anchors_same_url(self): method test_preserves_md_extension_urls (line 55) | def test_preserves_md_extension_urls(self): method test_md_extension_with_anchor_fragments (line 71) | def test_md_extension_with_anchor_fragments(self): method test_does_not_match_md_in_path (line 86) | def test_does_not_match_md_in_path(self): method test_removes_trailing_slashes (line 102) | def test_removes_trailing_slashes(self): method test_mixed_urls_with_and_without_anchors (line 118) | def test_mixed_urls_with_and_without_anchors(self): method test_empty_url_list (line 137) | def test_empty_url_list(self): method test_real_world_mikro_orm_case (line 144) | def test_real_world_mikro_orm_case(self): method test_preserves_query_parameters (line 166) | def test_preserves_query_parameters(self): method test_complex_anchor_formats (line 189) | def test_complex_anchor_formats(self): method test_url_order_preservation (line 204) | def test_url_order_preservation(self): FILE: tests/test_utilities.py class TestAPIKeyFunctions (line 25) | class TestAPIKeyFunctions(unittest.TestCase): method setUp (line 28) | def setUp(self): method tearDown (line 32) | def tearDown(self): method test_has_api_key_when_set (line 39) | def test_has_api_key_when_set(self): method test_has_api_key_when_not_set (line 44) | def test_has_api_key_when_not_set(self): method test_has_api_key_when_empty_string (line 50) | def test_has_api_key_when_empty_string(self): method test_has_api_key_when_whitespace_only (line 55) | def test_has_api_key_when_whitespace_only(self): method test_get_api_key_returns_key (line 60) | def test_get_api_key_returns_key(self): method test_get_api_key_returns_none_when_not_set (line 65) | def test_get_api_key_returns_none_when_not_set(self): method test_get_api_key_strips_whitespace (line 71) | def test_get_api_key_strips_whitespace(self): class TestGetUploadURL (line 77) | class TestGetUploadURL(unittest.TestCase): method test_get_upload_url_returns_correct_url (line 80) | def test_get_upload_url_returns_correct_url(self): method test_get_upload_url_returns_string (line 85) | def test_get_upload_url_returns_string(self): class TestFormatFileSize (line 91) | class TestFormatFileSize(unittest.TestCase): method test_format_bytes_below_1kb (line 94) | def test_format_bytes_below_1kb(self): method test_format_kilobytes (line 99) | def test_format_kilobytes(self): method test_format_megabytes (line 105) | def test_format_megabytes(self): method test_format_zero_bytes (line 111) | def test_format_zero_bytes(self): method test_format_large_files (line 115) | def test_format_large_files(self): class TestValidateSkillDirectory (line 123) | class TestValidateSkillDirectory(unittest.TestCase): method test_valid_skill_directory (line 126) | def test_valid_skill_directory(self): method test_nonexistent_directory (line 137) | def test_nonexistent_directory(self): method test_file_instead_of_directory (line 143) | def test_file_instead_of_directory(self): method test_directory_without_skill_md (line 150) | def test_directory_without_skill_md(self): class TestValidateZipFile (line 158) | class TestValidateZipFile(unittest.TestCase): method test_valid_zip_file (line 161) | def test_valid_zip_file(self): method test_nonexistent_file (line 174) | def test_nonexistent_file(self): method test_directory_instead_of_file (line 180) | def test_directory_instead_of_file(self): method test_wrong_extension (line 187) | def test_wrong_extension(self): class TestPrintUploadInstructions (line 195) | class TestPrintUploadInstructions(unittest.TestCase): method test_print_upload_instructions_runs (line 198) | def test_print_upload_instructions_runs(self): method test_print_upload_instructions_accepts_string_path (line 210) | def test_print_upload_instructions_accepts_string_path(self): class TestRetryWithBackoff (line 222) | class TestRetryWithBackoff(unittest.TestCase): method test_successful_operation_first_try (line 225) | def test_successful_operation_first_try(self): method test_successful_operation_after_retry (line 238) | def test_successful_operation_after_retry(self): method test_all_retries_fail (line 253) | def test_all_retries_fail(self): method test_exponential_backoff_timing (line 266) | def test_exponential_backoff_timing(self): class TestRetryWithBackoffAsync (line 289) | class TestRetryWithBackoffAsync(unittest.TestCase): method test_async_successful_operation (line 292) | def test_async_successful_operation(self): method test_async_retry_then_success (line 302) | def test_async_retry_then_success(self): method test_async_all_retries_fail (line 319) | def test_async_all_retries_fail(self): FILE: tests/test_video_scraper.py function _make_sample_video_info (line 42) | def _make_sample_video_info(): function _make_sample_transcript_segments (line 76) | def _make_sample_transcript_segments(): function _make_sample_srt_content (line 133) | def _make_sample_srt_content(): function _make_sample_vtt_content (line 149) | def _make_sample_vtt_content(): class TestVideoModels (line 169) | class TestVideoModels(unittest.TestCase): method test_video_source_type_enum (line 172) | def test_video_source_type_enum(self): method test_transcript_source_enum (line 179) | def test_transcript_source_enum(self): method test_segment_content_type_enum (line 186) | def test_segment_content_type_enum(self): method test_chapter_serialization (line 192) | def test_chapter_serialization(self): method test_transcript_segment_serialization (line 205) | def test_transcript_segment_serialization(self): method test_video_segment_serialization (line 223) | def test_video_segment_serialization(self): method test_video_segment_timestamp_display (line 244) | def test_video_segment_timestamp_display(self): method test_video_segment_timestamp_display_hours (line 250) | def test_video_segment_timestamp_display_hours(self): method test_video_info_serialization (line 256) | def test_video_info_serialization(self): method test_video_source_config_validation (line 269) | def test_video_source_config_validation(self): method test_video_scraper_result_serialization (line 287) | def test_video_scraper_result_serialization(self): method test_word_timestamp_serialization (line 302) | def test_word_timestamp_serialization(self): method test_code_block_serialization (line 312) | def test_code_block_serialization(self): class TestVideoMetadata (line 330) | class TestVideoMetadata(unittest.TestCase): method test_extract_video_id_standard_url (line 333) | def test_extract_video_id_standard_url(self): method test_extract_video_id_short_url (line 341) | def test_extract_video_id_short_url(self): method test_extract_video_id_embed_url (line 349) | def test_extract_video_id_embed_url(self): method test_extract_video_id_shorts_url (line 357) | def test_extract_video_id_shorts_url(self): method test_extract_video_id_not_youtube (line 365) | def test_extract_video_id_not_youtube(self): method test_detect_video_source_type_youtube (line 371) | def test_detect_video_source_type_youtube(self): method test_detect_video_source_type_vimeo (line 384) | def test_detect_video_source_type_vimeo(self): method test_extract_local_metadata (line 393) | def test_extract_local_metadata(self): class TestVideoTranscript (line 413) | class TestVideoTranscript(unittest.TestCase): method test_parse_srt (line 416) | def test_parse_srt(self): method test_parse_vtt (line 434) | def test_parse_vtt(self): method test_parse_srt_with_html_tags (line 450) | def test_parse_srt_with_html_tags(self): method test_whisper_stub_raises (line 469) | def test_whisper_stub_raises(self): method test_get_transcript_fallback_to_subtitle (line 477) | def test_get_transcript_fallback_to_subtitle(self): class TestVideoSegmenter (line 516) | class TestVideoSegmenter(unittest.TestCase): method test_segment_by_chapters (line 519) | def test_segment_by_chapters(self): method test_segment_by_time_window (line 531) | def test_segment_by_time_window(self): method test_segment_video_uses_chapters (line 542) | def test_segment_video_uses_chapters(self): method test_segment_video_fallback_to_time_window (line 555) | def test_segment_video_fallback_to_time_window(self): method test_segment_content_type_classification (line 573) | def test_segment_content_type_classification(self): class TestVideoSourceDetection (line 596) | class TestVideoSourceDetection(unittest.TestCase): method test_detect_youtube_url (line 599) | def test_detect_youtube_url(self): method test_detect_youtube_short_url (line 606) | def test_detect_youtube_short_url(self): method test_detect_youtube_playlist (line 612) | def test_detect_youtube_playlist(self): method test_detect_youtube_channel (line 619) | def test_detect_youtube_channel(self): method test_detect_vimeo_url (line 626) | def test_detect_vimeo_url(self): method test_detect_mp4_file (line 633) | def test_detect_mp4_file(self): method test_detect_mkv_file (line 641) | def test_detect_mkv_file(self): method test_detect_webm_file (line 647) | def test_detect_webm_file(self): method test_detect_avi_file (line 653) | def test_detect_avi_file(self): method test_detect_mov_file (line 659) | def test_detect_mov_file(self): method test_validate_video_file_exists (line 665) | def test_validate_video_file_exists(self): method test_validate_video_url_no_error (line 677) | def test_validate_video_url_no_error(self): class TestVideoArguments (line 696) | class TestVideoArguments(unittest.TestCase): method test_video_arguments_dict (line 699) | def test_video_arguments_dict(self): method test_add_video_arguments (line 710) | def test_add_video_arguments(self): method test_enhance_level_defaults_to_zero (line 721) | def test_enhance_level_defaults_to_zero(self): method test_unified_parser_has_video (line 731) | def test_unified_parser_has_video(self): class TestVideoToSkillConverter (line 745) | class TestVideoToSkillConverter(unittest.TestCase): method setUp (line 748) | def setUp(self): method tearDown (line 751) | def tearDown(self): method test_init_with_url (line 761) | def test_init_with_url(self): method test_init_with_video_file (line 768) | def test_init_with_video_file(self): method test_build_skill_from_loaded_data (line 775) | def test_build_skill_from_loaded_data(self): method test_save_and_load_extracted_data (line 848) | def test_save_and_load_extracted_data(self): class TestVideoVisualStubs (line 879) | class TestVideoVisualStubs(unittest.TestCase): method test_check_visual_dependencies (line 882) | def test_check_visual_dependencies(self): method test_detect_scenes_raises_without_deps (line 890) | def test_detect_scenes_raises_without_deps(self): method test_extract_keyframes_raises_without_deps (line 897) | def test_extract_keyframes_raises_without_deps(self): method test_classify_frame_raises_without_deps (line 904) | def test_classify_frame_raises_without_deps(self): method test_extract_text_raises_without_deps (line 911) | def test_extract_text_raises_without_deps(self): class TestVideoCreateCommandIntegration (line 924) | class TestVideoCreateCommandIntegration(unittest.TestCase): method test_create_command_routing_youtube_url (line 927) | def test_create_command_routing_youtube_url(self): method test_create_command_routing_video_file (line 935) | def test_create_command_routing_video_file(self): method test_create_arguments_include_video (line 942) | def test_create_arguments_include_video(self): class TestVideoConfigValidator (line 957) | class TestVideoConfigValidator(unittest.TestCase): method test_video_in_valid_source_types (line 960) | def test_video_in_valid_source_types(self): class TestVideoHelperFunctions (line 971) | class TestVideoHelperFunctions(unittest.TestCase): method test_sanitize_filename (line 974) | def test_sanitize_filename(self): method test_sanitize_filename_max_length (line 986) | def test_sanitize_filename_max_length(self): method test_format_duration (line 992) | def test_format_duration(self): method test_format_count (line 999) | def test_format_count(self): method test_infer_description_from_video (line 1005) | def test_infer_description_from_video(self): class TestOCRPreprocessing (line 1018) | class TestOCRPreprocessing(unittest.TestCase): method test_get_ocr_params_code_editor (line 1021) | def test_get_ocr_params_code_editor(self): method test_get_ocr_params_terminal (line 1031) | def test_get_ocr_params_terminal(self): method test_get_ocr_params_slide (line 1039) | def test_get_ocr_params_slide(self): method test_get_ocr_params_other (line 1047) | def test_get_ocr_params_other(self): method test_preprocess_returns_original_for_other (line 1054) | def test_preprocess_returns_original_for_other(self): method test_preprocess_returns_original_for_webcam (line 1061) | def test_preprocess_returns_original_for_webcam(self): class TestSpatialLayout (line 1074) | class TestSpatialLayout(unittest.TestCase): method test_cluster_empty_results (line 1077) | def test_cluster_empty_results(self): method test_cluster_single_result (line 1084) | def test_cluster_single_result(self): method test_cluster_two_lines (line 1094) | def test_cluster_two_lines(self): method test_cluster_same_line_fragments (line 1108) | def test_cluster_same_line_fragments(self): method test_cluster_monospace_flag (line 1121) | def test_cluster_monospace_flag(self): method test_assemble_code_editor_newlines (line 1136) | def test_assemble_code_editor_newlines(self): method test_assemble_slide_double_newlines (line 1149) | def test_assemble_slide_double_newlines(self): method test_assemble_other_flat (line 1160) | def test_assemble_other_flat(self): method test_assemble_empty_regions (line 1172) | def test_assemble_empty_regions(self): class TestTextContinuity (line 1185) | class TestTextContinuity(unittest.TestCase): method test_text_similarity_identical (line 1188) | def test_text_similarity_identical(self): method test_text_similarity_empty (line 1193) | def test_text_similarity_empty(self): method test_text_similarity_different (line 1200) | def test_text_similarity_different(self): method test_text_similarity_similar (line 1206) | def test_text_similarity_similar(self): method test_tracker_creates_new_block (line 1215) | def test_tracker_creates_new_block(self): method test_tracker_merges_similar_frames (line 1226) | def test_tracker_merges_similar_frames(self): method test_tracker_creates_separate_blocks_for_different_text (line 1241) | def test_tracker_creates_separate_blocks_for_different_text(self): method test_tracker_completes_on_non_code_frame (line 1251) | def test_tracker_completes_on_non_code_frame(self): method test_tracker_ignores_short_text (line 1264) | def test_tracker_ignores_short_text(self): method test_extract_code_blocks_filters_short (line 1273) | def test_extract_code_blocks_filters_short(self): method test_extract_code_blocks_maps_context (line 1291) | def test_extract_code_blocks_maps_context(self): method test_extract_code_blocks_skips_non_code_frames (line 1320) | def test_extract_code_blocks_skips_non_code_frames(self): method test_extract_visual_data_returns_tuple (line 1338) | def test_extract_visual_data_returns_tuple(self): method test_extract_text_from_frame_returns_tuple (line 1353) | def test_extract_text_from_frame_returns_tuple(self): class TestOutputFormatting (line 1372) | class TestOutputFormatting(unittest.TestCase): method setUp (line 1375) | def setUp(self): method tearDown (line 1378) | def tearDown(self): method test_reference_md_code_block_formatting (line 1381) | def test_reference_md_code_block_formatting(self): method test_reference_md_slide_formatting (line 1454) | def test_reference_md_slide_formatting(self): method test_skill_md_code_block_count (line 1513) | def test_skill_md_code_block_count(self): class TestYBucketConsensus (line 1585) | class TestYBucketConsensus(unittest.TestCase): method test_single_frame_single_region (line 1588) | def test_single_frame_single_region(self): method test_consensus_from_multiple_frames (line 1603) | def test_consensus_from_multiple_frames(self): method test_multiple_lines_tracked (line 1631) | def test_multiple_lines_tracked(self): method test_low_confidence_single_observation_empty (line 1650) | def test_low_confidence_single_observation_empty(self): method test_get_consensus_text_joins_lines (line 1664) | def test_get_consensus_text_joins_lines(self): method test_reset_clears_state (line 1683) | def test_reset_clears_state(self): method test_get_bucket_y_centers (line 1693) | def test_get_bucket_y_centers(self): class TestTextGroupLifecycle (line 1717) | class TestTextGroupLifecycle(unittest.TestCase): method test_single_block_creates_group (line 1720) | def test_single_block_creates_group(self): method test_same_text_reappears_same_group (line 1743) | def test_same_text_reappears_same_group(self): method test_different_text_creates_new_group (line 1766) | def test_different_text_creates_new_group(self): method test_edit_detected_between_appearances (line 1788) | def test_edit_detected_between_appearances(self): method test_tracker_y_bucket_matching (line 1827) | def test_tracker_y_bucket_matching(self): method test_compute_edit_no_changes (line 1855) | def test_compute_edit_no_changes(self): method test_compute_edit_with_additions (line 1862) | def test_compute_edit_with_additions(self): method test_compute_edit_with_removals (line 1870) | def test_compute_edit_with_removals(self): class TestTextGroupTimeline (line 1884) | class TestTextGroupTimeline(unittest.TestCase): method test_timeline_serialization (line 1887) | def test_timeline_serialization(self): method test_get_groups_at_time (line 1915) | def test_get_groups_at_time(self): method test_text_group_full_text (line 1947) | def test_text_group_full_text(self): method test_text_group_serialization (line 1962) | def test_text_group_serialization(self): method test_code_block_text_group_id (line 1991) | def test_code_block_text_group_id(self): method test_video_info_timeline_serialization (line 2007) | def test_video_info_timeline_serialization(self): method test_video_info_no_timeline_serialization (line 2038) | def test_video_info_no_timeline_serialization(self): method test_extract_visual_data_returns_3_tuple (line 2048) | def test_extract_visual_data_returns_3_tuple(self): class TestAudioVisualAlignment (line 2068) | class TestAudioVisualAlignment(unittest.TestCase): method test_alignment_serialization (line 2071) | def test_alignment_serialization(self): method test_build_audio_visual_alignments (line 2091) | def test_build_audio_visual_alignments(self): method test_build_alignments_no_overlap (line 2142) | def test_build_alignments_no_overlap(self): method test_reference_md_code_timeline_section (line 2170) | def test_reference_md_code_timeline_section(self): method test_reference_md_audio_visual_section (line 2233) | def test_reference_md_audio_visual_section(self): class TestDarkThemePreprocessing (line 2296) | class TestDarkThemePreprocessing(unittest.TestCase): method test_detect_theme_dark (line 2299) | def test_detect_theme_dark(self): method test_detect_theme_light (line 2309) | def test_detect_theme_light(self): method test_preprocess_inverts_dark_frame (line 2319) | def test_preprocess_inverts_dark_frame(self): method test_preprocess_keeps_light_frame_orientation (line 2355) | def test_preprocess_keeps_light_frame_orientation(self): class TestMultiEngineOCR (line 2389) | class TestMultiEngineOCR(unittest.TestCase): method test_tesseract_ocr_returns_correct_format (line 2392) | def test_tesseract_ocr_returns_correct_format(self): method test_multi_engine_picks_higher_confidence (line 2427) | def test_multi_engine_picks_higher_confidence(self): method test_multi_engine_code_token_preference (line 2438) | def test_multi_engine_code_token_preference(self): method test_multi_engine_single_engine_fallback (line 2449) | def test_multi_engine_single_engine_fallback(self): class TestClaudeVisionOCR (line 2464) | class TestClaudeVisionOCR(unittest.TestCase): method test_vision_ocr_no_api_key (line 2467) | def test_vision_ocr_no_api_key(self): method test_vision_ocr_success (line 2481) | def test_vision_ocr_success(self): method test_vision_fallback_on_low_confidence (line 2517) | def test_vision_fallback_on_low_confidence(self): class TestRegionDetection (line 2529) | class TestRegionDetection(unittest.TestCase): method test_single_panel_no_dividers (line 2532) | def test_single_panel_no_dividers(self): method test_vertical_divider_splits_panels (line 2557) | def test_vertical_divider_splits_panels(self): method test_find_code_bbox_merges_regions (line 2582) | def test_find_code_bbox_merges_regions(self): method test_find_code_bbox_returns_none_for_no_code (line 2596) | def test_find_code_bbox_returns_none_for_no_code(self): method test_small_panels_filtered_out (line 2607) | def test_small_panels_filtered_out(self): method test_crop_code_region (line 2635) | def test_crop_code_region(self): class TestPerPanelOCR (line 2663) | class TestPerPanelOCR(unittest.TestCase): method test_get_code_panels_returns_individual_panels (line 2666) | def test_get_code_panels_returns_individual_panels(self): method test_get_code_panels_includes_terminals (line 2682) | def test_get_code_panels_includes_terminals(self): method test_get_code_panels_filters_narrow_panels (line 2696) | def test_get_code_panels_filters_narrow_panels(self): method test_get_code_panels_custom_min_width (line 2713) | def test_get_code_panels_custom_min_width(self): method test_frame_subsection_serialization (line 2728) | def test_frame_subsection_serialization(self): method test_keyframe_with_sub_sections (line 2754) | def test_keyframe_with_sub_sections(self): method test_tracker_panel_position_matching (line 2790) | def test_tracker_panel_position_matching(self): method test_tracker_separate_panels_tracked_separately (line 2823) | def test_tracker_separate_panels_tracked_separately(self): class TestTextGroupPanelId (line 2860) | class TestTextGroupPanelId(unittest.TestCase): method test_text_group_inherits_panel_id (line 2863) | def test_text_group_inherits_panel_id(self): method test_text_group_panel_id_serialization (line 2894) | def test_text_group_panel_id_serialization(self): class TestVideoEnhanceSourceDetection (line 2918) | class TestVideoEnhanceSourceDetection(unittest.TestCase): method test_utils_detect_video_source (line 2921) | def test_utils_detect_video_source(self): method test_utils_non_video_not_detected (line 2938) | def test_utils_non_video_not_detected(self): class TestVideoEnhancementPrompt (line 2954) | class TestVideoEnhancementPrompt(unittest.TestCase): method test_is_video_source_true (line 2957) | def test_is_video_source_true(self): method test_is_video_source_false (line 2972) | def test_is_video_source_false(self): method test_video_prompt_contains_key_instructions (line 2986) | def test_video_prompt_contains_key_instructions(self): method test_video_prompt_dispatched_automatically (line 3021) | def test_video_prompt_dispatched_automatically(self): class TestVideoWorkflowAutoInjection (line 3053) | class TestVideoWorkflowAutoInjection(unittest.TestCase): method test_workflow_auto_injected (line 3056) | def test_workflow_auto_injected(self): method test_workflow_not_overridden (line 3075) | def test_workflow_not_overridden(self): method test_video_tutorial_yaml_exists (line 3094) | def test_video_tutorial_yaml_exists(self): class TestTimeClipping (line 3123) | class TestTimeClipping(unittest.TestCase): method test_parse_time_seconds_integer (line 3128) | def test_parse_time_seconds_integer(self): method test_parse_time_seconds_float (line 3133) | def test_parse_time_seconds_float(self): method test_parse_time_mmss (line 3138) | def test_parse_time_mmss(self): method test_parse_time_hhmmss (line 3143) | def test_parse_time_hhmmss(self): method test_parse_time_zero (line 3148) | def test_parse_time_zero(self): method test_parse_time_decimal_mmss (line 3155) | def test_parse_time_decimal_mmss(self): method test_parse_time_invalid_raises (line 3160) | def test_parse_time_invalid_raises(self): method test_parse_time_empty_raises (line 3166) | def test_parse_time_empty_raises(self): method test_parse_time_too_many_colons_raises (line 3172) | def test_parse_time_too_many_colons_raises(self): method test_video_arguments_include_start_end_time (line 3180) | def test_video_arguments_include_start_end_time(self): method test_create_arguments_include_start_end_time (line 3186) | def test_create_arguments_include_start_end_time(self): method test_argument_parsing_defaults_none (line 3192) | def test_argument_parsing_defaults_none(self): method test_argument_parsing_with_values (line 3202) | def test_argument_parsing_with_values(self): method test_transcript_clip_filters_segments (line 3216) | def test_transcript_clip_filters_segments(self): method test_transcript_clip_start_only (line 3234) | def test_transcript_clip_start_only(self): method test_playlist_plus_clip_rejected (line 3250) | def test_playlist_plus_clip_rejected(self): method test_start_gte_end_rejected (line 3260) | def test_start_gte_end_rejected(self): method test_valid_clip_no_errors (line 3269) | def test_valid_clip_no_errors(self): method test_video_info_clip_roundtrip (line 3280) | def test_video_info_clip_roundtrip(self): method test_video_info_no_clip_roundtrip (line 3301) | def test_video_info_no_clip_roundtrip(self): method test_source_config_clip_fields (line 3316) | def test_source_config_clip_fields(self): method test_source_config_clip_defaults_none (line 3329) | def test_source_config_clip_defaults_none(self): method test_converter_init_with_clip_times (line 3338) | def test_converter_init_with_clip_times(self): method test_converter_init_without_clip_times (line 3351) | def test_converter_init_without_clip_times(self): method test_segmenter_time_window_with_offset (line 3361) | def test_segmenter_time_window_with_offset(self): method test_segmenter_time_window_offset_with_transcript (line 3373) | def test_segmenter_time_window_offset_with_transcript(self): class TestCleanOcrLine (line 3404) | class TestCleanOcrLine(unittest.TestCase): method test_strips_leading_line_numbers (line 3407) | def test_strips_leading_line_numbers(self): method test_strips_ide_decorations (line 3414) | def test_strips_ide_decorations(self): method test_strips_collapse_markers (line 3423) | def test_strips_collapse_markers(self): method test_preserves_normal_code (line 3429) | def test_preserves_normal_code(self): class TestFixIntraLineDuplication (line 3439) | class TestFixIntraLineDuplication(unittest.TestCase): method test_fixes_simple_duplication (line 3442) | def test_fixes_simple_duplication(self): method test_preserves_non_duplicated (line 3451) | def test_preserves_non_duplicated(self): method test_short_lines_unchanged (line 3457) | def test_short_lines_unchanged(self): class TestIsLikelyCode (line 3464) | class TestIsLikelyCode(unittest.TestCase): method test_true_for_real_code (line 3467) | def test_true_for_real_code(self): method test_false_for_ui_junk (line 3475) | def test_false_for_ui_junk(self): method test_code_tokens_must_exceed_ui (line 3483) | def test_code_tokens_must_exceed_ui(self): class TestTextGroupLanguageDetection (line 3490) | class TestTextGroupLanguageDetection(unittest.TestCase): method test_groups_get_language_detected (line 3493) | def test_groups_get_language_detected(self): class TestSkipWebcamOcr (line 3525) | class TestSkipWebcamOcr(unittest.TestCase): method test_webcam_frame_type_excluded_from_ocr_condition (line 3528) | def test_webcam_frame_type_excluded_from_ocr_condition(self): class TestReferenceSkipsJunkCodeFences (line 3543) | class TestReferenceSkipsJunkCodeFences(unittest.TestCase): method test_junk_text_not_in_code_fence (line 3546) | def test_junk_text_not_in_code_fence(self): method test_real_code_in_code_fence (line 3561) | def test_real_code_in_code_fence(self): class TestFuzzyWordMatch (line 3576) | class TestFuzzyWordMatch(unittest.TestCase): method test_exact_match (line 3579) | def test_exact_match(self): method test_prefix_noise (line 3584) | def test_prefix_noise(self): method test_different_words (line 3591) | def test_different_words(self): FILE: tests/test_video_setup.py class TestGPUDetection (line 56) | class TestGPUDetection(unittest.TestCase): method test_nvidia_detected (line 61) | def test_nvidia_detected(self, mock_run, mock_which): method test_amd_rocm_detected (line 81) | def test_amd_rocm_detected(self, mock_rocm_ver, mock_run, mock_which): method test_amd_no_rocm_fallback (line 102) | def test_amd_no_rocm_fallback(self, mock_run, mock_which): method test_cpu_fallback (line 122) | def test_cpu_fallback(self, mock_which): method test_nvidia_smi_error (line 130) | def test_nvidia_smi_error(self, mock_run, mock_which): method test_nvidia_smi_timeout (line 139) | def test_nvidia_smi_timeout(self, mock_run, mock_which): method test_rocminfo_error (line 148) | def test_rocminfo_error(self, mock_run, mock_which): class TestVersionMapping (line 169) | class TestVersionMapping(unittest.TestCase): method test_cuda_124 (line 172) | def test_cuda_124(self): method test_cuda_126 (line 175) | def test_cuda_126(self): method test_cuda_121 (line 178) | def test_cuda_121(self): method test_cuda_118 (line 181) | def test_cuda_118(self): method test_cuda_old_falls_to_cpu (line 184) | def test_cuda_old_falls_to_cpu(self): method test_cuda_invalid_string (line 187) | def test_cuda_invalid_string(self): method test_rocm_63 (line 190) | def test_rocm_63(self): method test_rocm_60 (line 193) | def test_rocm_60(self): method test_rocm_old_falls_to_cpu (line 196) | def test_rocm_old_falls_to_cpu(self): method test_rocm_invalid (line 199) | def test_rocm_invalid(self): class TestVenv (line 208) | class TestVenv(unittest.TestCase): method test_is_in_venv_returns_bool (line 211) | def test_is_in_venv_returns_bool(self): method test_is_in_venv_detects_prefix_mismatch (line 215) | def test_is_in_venv_detects_prefix_mismatch(self): method test_is_in_venv_detects_no_venv (line 220) | def test_is_in_venv_detects_no_venv(self): method test_create_venv_in_tempdir (line 224) | def test_create_venv_in_tempdir(self): method test_create_venv_already_exists (line 231) | def test_create_venv_already_exists(self): method test_get_venv_python_linux (line 238) | def test_get_venv_python_linux(self): method test_get_venv_activate_cmd_linux (line 243) | def test_get_venv_activate_cmd_linux(self): class TestSystemDeps (line 255) | class TestSystemDeps(unittest.TestCase): method test_tesseract_not_installed (line 259) | def test_tesseract_not_installed(self, mock_which): method test_tesseract_installed_with_eng (line 267) | def test_tesseract_installed_with_eng(self, mock_which, mock_run): method test_tesseract_installed_no_eng (line 280) | def test_tesseract_installed_no_eng(self, mock_which, mock_run): method test_detect_distro_returns_string (line 289) | def test_detect_distro_returns_string(self): method test_detect_distro_no_os_release (line 294) | def test_detect_distro_no_os_release(self, mock_open): class TestROCmConfig (line 303) | class TestROCmConfig(unittest.TestCase): method test_sets_miopen_find_mode (line 306) | def test_sets_miopen_find_mode(self): method test_does_not_override_existing (line 317) | def test_does_not_override_existing(self): method test_sets_miopen_user_db_path (line 331) | def test_sets_miopen_user_db_path(self): class TestModuleSelection (line 348) | class TestModuleSelection(unittest.TestCase): method test_default_modules_all_true (line 351) | def test_default_modules_all_true(self): method test_build_all_deps (line 360) | def test_build_all_deps(self): method test_build_no_optional_deps (line 370) | def test_build_no_optional_deps(self): method test_build_partial_deps (line 383) | def test_build_partial_deps(self): class TestInstallation (line 401) | class TestInstallation(unittest.TestCase): method test_install_torch_success (line 405) | def test_install_torch_success(self, mock_run): method test_install_torch_cpu (line 415) | def test_install_torch_cpu(self, mock_run): method test_install_torch_failure (line 423) | def test_install_torch_failure(self, mock_run): method test_install_torch_timeout (line 429) | def test_install_torch_timeout(self, mock_run): method test_install_torch_custom_python (line 435) | def test_install_torch_custom_python(self, mock_run): method test_install_visual_deps_success (line 443) | def test_install_visual_deps_success(self, mock_run): method test_install_visual_deps_failure (line 450) | def test_install_visual_deps_failure(self, mock_run): method test_install_visual_deps_partial_modules (line 455) | def test_install_visual_deps_partial_modules(self, mock_run): method test_install_visual_deps_base_only (line 466) | def test_install_visual_deps_base_only(self, mock_run): class TestVerification (line 485) | class TestVerification(unittest.TestCase): method test_returns_dict (line 489) | def test_returns_dict(self): method test_expected_keys (line 493) | def test_expected_keys(self): class TestRunSetup (line 512) | class TestRunSetup(unittest.TestCase): method test_non_interactive_success (line 520) | def test_non_interactive_success( method test_failure_returns_nonzero (line 552) | def test_failure_returns_nonzero(self, mock_detect, mock_tess, mock_to... method test_visual_deps_failure (line 571) | def test_visual_deps_failure(self, mock_detect, mock_tess, mock_deps, ... method test_rocm_configures_env (line 591) | def test_rocm_configures_env(self, mock_detect, mock_tess, mock_torch,... class TestTesseractCircuitBreaker (line 624) | class TestTesseractCircuitBreaker(unittest.TestCase): method test_circuit_breaker_flag_exists (line 627) | def test_circuit_breaker_flag_exists(self): method test_circuit_breaker_skips_after_failure (line 632) | def test_circuit_breaker_skips_after_failure(self): method test_circuit_breaker_allows_when_not_broken (line 645) | def test_circuit_breaker_allows_when_not_broken(self): class TestMIOPENEnvVars (line 667) | class TestMIOPENEnvVars(unittest.TestCase): method test_miopen_find_mode_set (line 670) | def test_miopen_find_mode_set(self): method test_miopen_user_db_path_set (line 674) | def test_miopen_user_db_path_set(self): class TestVideoArgumentSetup (line 683) | class TestVideoArgumentSetup(unittest.TestCase): method test_setup_in_video_arguments (line 686) | def test_setup_in_video_arguments(self): method test_parser_accepts_setup (line 692) | def test_parser_accepts_setup(self): method test_parser_default_false (line 702) | def test_parser_default_false(self): class TestVideoScraperSetupEarlyExit (line 713) | class TestVideoScraperSetupEarlyExit(unittest.TestCase): method test_setup_skips_source_validation (line 717) | def test_setup_skips_source_validation(self, mock_setup): FILE: tests/test_word_scraper.py function _make_sample_extracted_data (line 34) | def _make_sample_extracted_data( class TestWordToSkillConverterInit (line 89) | class TestWordToSkillConverterInit(unittest.TestCase): method setUp (line 92) | def setUp(self): method tearDown (line 100) | def tearDown(self): method test_init_with_name_and_docx_path (line 104) | def test_init_with_name_and_docx_path(self): method test_init_with_full_config (line 111) | def test_init_with_full_config(self): method test_init_requires_name (line 122) | def test_init_requires_name(self): method test_default_description_uses_name (line 127) | def test_default_description_uses_name(self): method test_skill_dir_uses_name (line 133) | def test_skill_dir_uses_name(self): method test_name_auto_detected_from_filename (line 139) | def test_name_auto_detected_from_filename(self): class TestWordCategorization (line 147) | class TestWordCategorization(unittest.TestCase): method setUp (line 150) | def setUp(self): method tearDown (line 158) | def tearDown(self): method test_single_docx_creates_single_category (line 161) | def test_single_docx_creates_single_category(self): method test_keyword_based_categorization (line 174) | def test_keyword_based_categorization(self): method test_fallback_to_content_category (line 211) | def test_fallback_to_content_category(self): class TestWordSkillBuilding (line 223) | class TestWordSkillBuilding(unittest.TestCase): method setUp (line 226) | def setUp(self): method tearDown (line 234) | def tearDown(self): method test_build_skill_creates_directory_structure (line 237) | def test_build_skill_creates_directory_structure(self): method test_build_skill_creates_skill_md (line 252) | def test_build_skill_creates_skill_md(self): method test_build_skill_creates_reference_files (line 272) | def test_build_skill_creates_reference_files(self): method test_skill_md_has_yaml_frontmatter (line 286) | def test_skill_md_has_yaml_frontmatter(self): method test_skill_md_includes_section_overview (line 301) | def test_skill_md_includes_section_overview(self): class TestWordCodeBlocks (line 316) | class TestWordCodeBlocks(unittest.TestCase): method setUp (line 319) | def setUp(self): method tearDown (line 327) | def tearDown(self): method test_code_blocks_included_in_references (line 330) | def test_code_blocks_included_in_references(self): method test_code_examples_in_skill_md (line 344) | def test_code_examples_in_skill_md(self): method test_language_detected_in_statistics (line 357) | def test_language_detected_in_statistics(self): class TestWordTables (line 371) | class TestWordTables(unittest.TestCase): method setUp (line 374) | def setUp(self): method tearDown (line 382) | def tearDown(self): method test_tables_rendered_in_references (line 385) | def test_tables_rendered_in_references(self): method test_table_summary_in_skill_md (line 400) | def test_table_summary_in_skill_md(self): class TestWordImages (line 414) | class TestWordImages(unittest.TestCase): method setUp (line 417) | def setUp(self): method tearDown (line 425) | def tearDown(self): method test_images_saved_to_assets (line 428) | def test_images_saved_to_assets(self): method test_image_references_in_markdown (line 441) | def test_image_references_in_markdown(self): class TestWordErrorHandling (line 456) | class TestWordErrorHandling(unittest.TestCase): method setUp (line 459) | def setUp(self): method tearDown (line 467) | def tearDown(self): method test_missing_docx_file_raises_error (line 470) | def test_missing_docx_file_raises_error(self): method test_invalid_config_raises_error (line 477) | def test_invalid_config_raises_error(self): method test_missing_name_raises_key_error (line 482) | def test_missing_name_raises_key_error(self): method test_non_docx_file_raises_value_error (line 487) | def test_non_docx_file_raises_value_error(self): method test_doc_file_raises_value_error (line 498) | def test_doc_file_raises_value_error(self): method test_no_extension_file_raises_value_error (line 508) | def test_no_extension_file_raises_value_error(self): class TestWordJSONWorkflow (line 519) | class TestWordJSONWorkflow(unittest.TestCase): method setUp (line 522) | def setUp(self): method tearDown (line 530) | def tearDown(self): method test_load_from_json (line 533) | def test_load_from_json(self): method test_build_from_json_without_extraction (line 546) | def test_build_from_json_without_extraction(self): method test_skill_built_from_json_has_skill_md (line 559) | def test_skill_built_from_json_has_skill_md(self): class TestWordCLIArguments (line 575) | class TestWordCLIArguments(unittest.TestCase): method setUp (line 578) | def setUp(self): method test_docx_argument_accepted (line 587) | def test_docx_argument_accepted(self): method test_api_key_accepted (line 592) | def test_api_key_accepted(self): method test_enhance_level_accepted (line 597) | def test_enhance_level_accepted(self): method test_enhance_workflow_accepted (line 602) | def test_enhance_workflow_accepted(self): method test_workflow_dry_run_accepted (line 609) | def test_workflow_dry_run_accepted(self): method test_dry_run_accepted (line 614) | def test_dry_run_accepted(self): method test_from_json_accepted (line 619) | def test_from_json_accepted(self): method test_name_accepted (line 624) | def test_name_accepted(self): class TestWordHelperFunctions (line 630) | class TestWordHelperFunctions(unittest.TestCase): method setUp (line 633) | def setUp(self): method test_build_section_basic (line 637) | def test_build_section_basic(self): method test_extract_table_from_html (line 653) | def test_extract_table_from_html(self): method test_score_code_quality_basic (line 676) | def test_score_code_quality_basic(self): method test_score_code_quality_empty (line 684) | def test_score_code_quality_empty(self): method test_infer_description_from_word_subject (line 690) | def test_infer_description_from_word_subject(self): method test_infer_description_from_word_fallback (line 698) | def test_infer_description_from_word_fallback(self): class TestWordSourceDetection (line 706) | class TestWordSourceDetection(unittest.TestCase): method test_docx_detected_as_word_type (line 709) | def test_docx_detected_as_word_type(self): method test_docx_validation_missing_file (line 719) | def test_docx_validation_missing_file(self): method test_pdf_still_detected (line 728) | def test_pdf_still_detected(self): FILE: tests/test_workflow_runner.py function make_args (line 25) | def make_args( class TestCollectWorkflowVars (line 43) | class TestCollectWorkflowVars: method test_no_vars (line 44) | def test_no_vars(self): method test_single_var (line 48) | def test_single_var(self): method test_multiple_vars (line 52) | def test_multiple_vars(self): method test_var_with_equals_in_value (line 57) | def test_var_with_equals_in_value(self): method test_extra_context_merged (line 62) | def test_extra_context_merged(self): method test_extra_context_overridden_by_var (line 67) | def test_extra_context_overridden_by_var(self): method test_invalid_var_skipped (line 74) | def test_invalid_var_skipped(self): class TestRunWorkflowsNoFlags (line 84) | class TestRunWorkflowsNoFlags: method test_returns_false_empty_when_no_flags (line 85) | def test_returns_false_empty_when_no_flags(self): method test_returns_false_when_empty_lists (line 91) | def test_returns_false_when_empty_lists(self): class TestRunWorkflowsSingle (line 98) | class TestRunWorkflowsSingle: method test_single_workflow_executes (line 101) | def test_single_workflow_executes(self): method test_single_workflow_failed_load_skipped (line 119) | def test_single_workflow_failed_load_skipped(self): method test_single_workflow_run_failure_continues (line 131) | def test_single_workflow_run_failure_continues(self): class TestRunWorkflowsMultiple (line 151) | class TestRunWorkflowsMultiple: method test_two_workflows_both_execute (line 154) | def test_two_workflows_both_execute(self): method test_three_workflows_in_order (line 176) | def test_three_workflows_in_order(self): method test_partial_failure_partial_success (line 201) | def test_partial_failure_partial_success(self): class TestRunWorkflowsInlineStages (line 225) | class TestRunWorkflowsInlineStages: method test_inline_stages_execute (line 228) | def test_inline_stages_execute(self): method test_inline_stage_without_colon (line 254) | def test_inline_stage_without_colon(self): class TestRunWorkflowsMixed (line 273) | class TestRunWorkflowsMixed: method test_named_then_inline (line 276) | def test_named_then_inline(self): class TestRunWorkflowsVariables (line 303) | class TestRunWorkflowsVariables: method test_variables_passed_to_run (line 304) | def test_variables_passed_to_run(self): class TestRunWorkflowsDryRun (line 328) | class TestRunWorkflowsDryRun: method test_dry_run_calls_preview_not_run (line 329) | def test_dry_run_calls_preview_not_run(self): method test_dry_run_multiple_workflows_all_previewed (line 353) | def test_dry_run_multiple_workflows_all_previewed(self): class TestBundledPresetsLoad (line 384) | class TestBundledPresetsLoad: method test_bundled_preset_loads (line 400) | def test_bundled_preset_loads(self, preset_name): method test_bundled_preset_stages_have_required_fields (line 410) | def test_bundled_preset_stages_have_required_fields(self, preset_name): method test_unknown_preset_raises_file_not_found (line 420) | def test_unknown_preset_raises_file_not_found(self): method test_list_bundled_workflows_returns_all (line 426) | def test_list_bundled_workflows_returns_all(self): method test_list_user_workflows_empty_when_no_user_dir (line 433) | def test_list_user_workflows_empty_when_no_user_dir(self, tmp_path, mo... FILE: tests/test_workflow_tools_mcp.py function tmp_user_dir (line 50) | def tmp_user_dir(tmp_path, monkeypatch): function _mock_bundled_names (line 58) | def _mock_bundled_names(names=("default", "security-focus")): function _mock_bundled_text (line 65) | def _mock_bundled_text(mapping: dict): function _text (line 75) | def _text(result) -> str: class TestListWorkflowsTool (line 88) | class TestListWorkflowsTool: method test_lists_bundled_and_user (line 89) | def test_lists_bundled_and_user(self, tmp_user_dir): method test_empty_lists (line 104) | def test_empty_lists(self, tmp_user_dir): class TestGetWorkflowTool (line 121) | class TestGetWorkflowTool: method test_get_bundled (line 122) | def test_get_bundled(self): method test_get_not_found (line 133) | def test_get_not_found(self, tmp_user_dir): method test_missing_name_param (line 142) | def test_missing_name_param(self): method test_get_user_workflow (line 148) | def test_get_user_workflow(self, tmp_user_dir): class TestCreateWorkflowTool (line 161) | class TestCreateWorkflowTool: method test_create_new_workflow (line 162) | def test_create_new_workflow(self, tmp_user_dir): method test_create_duplicate_fails (line 170) | def test_create_duplicate_fails(self, tmp_user_dir): method test_create_invalid_yaml (line 177) | def test_create_invalid_yaml(self, tmp_user_dir): method test_create_missing_name (line 183) | def test_create_missing_name(self): method test_create_missing_content (line 189) | def test_create_missing_content(self): class TestUpdateWorkflowTool (line 201) | class TestUpdateWorkflowTool: method test_update_user_workflow (line 202) | def test_update_user_workflow(self, tmp_user_dir): method test_update_bundled_refused (line 214) | def test_update_bundled_refused(self, tmp_user_dir): method test_update_invalid_yaml (line 222) | def test_update_invalid_yaml(self, tmp_user_dir): method test_update_user_override_of_bundled_name (line 232) | def test_update_user_override_of_bundled_name(self, tmp_user_dir): class TestDeleteWorkflowTool (line 251) | class TestDeleteWorkflowTool: method test_delete_user_workflow (line 252) | def test_delete_user_workflow(self, tmp_user_dir): method test_delete_bundled_refused (line 264) | def test_delete_bundled_refused(self, tmp_user_dir): method test_delete_nonexistent (line 272) | def test_delete_nonexistent(self, tmp_user_dir): method test_delete_yml_extension (line 280) | def test_delete_yml_extension(self, tmp_user_dir): method test_delete_missing_name (line 291) | def test_delete_missing_name(self): FILE: tests/test_workflows_command.py function tmp_user_dir (line 58) | def tmp_user_dir(tmp_path, monkeypatch): function sample_yaml_file (line 72) | def sample_yaml_file(tmp_path): function _mock_bundled (line 84) | def _mock_bundled(names=("default", "minimal", "security-focus")): function _mock_bundled_text (line 89) | def _mock_bundled_text(name_to_text: dict): class TestCmdList (line 103) | class TestCmdList: method test_shows_bundled_and_user (line 104) | def test_shows_bundled_and_user(self, capsys, tmp_user_dir): method test_no_workflows (line 118) | def test_no_workflows(self, capsys, tmp_user_dir): method test_only_bundled (line 125) | def test_only_bundled(self, capsys, tmp_user_dir): class TestCmdShow (line 139) | class TestCmdShow: method test_show_bundled (line 140) | def test_show_bundled(self, capsys): method test_show_not_found (line 146) | def test_show_not_found(self, capsys): method test_show_user_workflow (line 152) | def test_show_user_workflow(self, capsys, tmp_user_dir): class TestCmdCopy (line 164) | class TestCmdCopy: method test_copy_bundled_to_user_dir (line 165) | def test_copy_bundled_to_user_dir(self, capsys, tmp_user_dir): method test_copy_nonexistent (line 174) | def test_copy_nonexistent(self, capsys, tmp_user_dir): method test_copy_overwrites_existing (line 180) | def test_copy_overwrites_existing(self, capsys, tmp_user_dir): method test_copy_multiple (line 191) | def test_copy_multiple(self, capsys, tmp_user_dir): method test_copy_partial_failure_continues (line 201) | def test_copy_partial_failure_continues(self, capsys, tmp_user_dir): class TestCmdAdd (line 216) | class TestCmdAdd: method test_add_valid_yaml (line 217) | def test_add_valid_yaml(self, capsys, tmp_user_dir, sample_yaml_file): method test_add_with_override_name (line 224) | def test_add_with_override_name(self, capsys, tmp_user_dir, sample_yam... method test_add_invalid_yaml (line 229) | def test_add_invalid_yaml(self, capsys, tmp_path, tmp_user_dir): method test_add_nonexistent_file (line 236) | def test_add_nonexistent_file(self, capsys, tmp_user_dir): method test_add_wrong_extension (line 241) | def test_add_wrong_extension(self, capsys, tmp_path, tmp_user_dir): method test_add_overwrites_with_warning (line 247) | def test_add_overwrites_with_warning(self, capsys, tmp_user_dir, sampl... method test_add_multiple_files (line 254) | def test_add_multiple_files(self, capsys, tmp_user_dir, tmp_path): method test_add_multiple_name_flag_rejected (line 269) | def test_add_multiple_name_flag_rejected(self, capsys, tmp_user_dir, t... method test_add_partial_failure_continues (line 281) | def test_add_partial_failure_continues(self, capsys, tmp_user_dir, tmp... class TestCmdRemove (line 298) | class TestCmdRemove: method test_remove_user_workflow (line 299) | def test_remove_user_workflow(self, capsys, tmp_user_dir): method test_remove_bundled_refused (line 310) | def test_remove_bundled_refused(self, capsys, tmp_user_dir): method test_remove_nonexistent (line 316) | def test_remove_nonexistent(self, capsys, tmp_user_dir): method test_remove_yml_extension (line 322) | def test_remove_yml_extension(self, capsys, tmp_user_dir): method test_remove_multiple (line 332) | def test_remove_multiple(self, capsys, tmp_user_dir): method test_remove_partial_failure_continues (line 344) | def test_remove_partial_failure_continues(self, capsys, tmp_user_dir): class TestCmdValidate (line 361) | class TestCmdValidate: method test_validate_bundled_by_name (line 362) | def test_validate_bundled_by_name(self, capsys): method test_validate_file_path (line 378) | def test_validate_file_path(self, capsys, sample_yaml_file): method test_validate_not_found (line 383) | def test_validate_not_found(self, capsys): method test_validate_invalid_content (line 389) | def test_validate_invalid_content(self, capsys, tmp_path): class TestMain (line 401) | class TestMain: method test_main_no_action_exits_0 (line 402) | def test_main_no_action_exits_0(self): method test_main_list (line 409) | def test_main_list(self, capsys, tmp_user_dir): method test_main_validate_success (line 417) | def test_main_validate_success(self, capsys, sample_yaml_file): method test_main_show_success (line 424) | def test_main_show_success(self, capsys, tmp_user_dir): method test_main_show_not_found_exits_1 (line 431) | def test_main_show_not_found_exits_1(self, capsys, tmp_user_dir): method test_main_copy_single (line 439) | def test_main_copy_single(self, capsys, tmp_user_dir): method test_main_copy_multiple (line 445) | def test_main_copy_multiple(self, capsys, tmp_user_dir): method test_main_copy_not_found_exits_1 (line 453) | def test_main_copy_not_found_exits_1(self, capsys, tmp_user_dir): method test_main_add_single_file (line 458) | def test_main_add_single_file(self, capsys, tmp_user_dir, sample_yaml_... method test_main_add_multiple_files (line 464) | def test_main_add_multiple_files(self, capsys, tmp_user_dir, tmp_path): method test_main_add_with_name_flag (line 475) | def test_main_add_with_name_flag(self, capsys, tmp_user_dir, sample_ya... method test_main_add_name_rejected_for_multiple (line 481) | def test_main_add_name_rejected_for_multiple(self, capsys, tmp_user_di... method test_main_remove_single (line 490) | def test_main_remove_single(self, capsys, tmp_user_dir): method test_main_remove_multiple (line 497) | def test_main_remove_multiple(self, capsys, tmp_user_dir): method test_main_remove_bundled_refused (line 506) | def test_main_remove_bundled_refused(self, capsys, tmp_user_dir): method test_main_remove_not_found_exits_1 (line 511) | def test_main_remove_not_found_exits_1(self, capsys, tmp_user_dir): class TestWorkflowsParserArgumentBinding (line 522) | class TestWorkflowsParserArgumentBinding: method _parse (line 525) | def _parse(self, argv): method test_copy_single_produces_list (line 544) | def test_copy_single_produces_list(self): method test_copy_multiple_produces_list (line 548) | def test_copy_multiple_produces_list(self): method test_add_single_produces_list (line 552) | def test_add_single_produces_list(self): method test_add_multiple_produces_list (line 556) | def test_add_multiple_produces_list(self): method test_add_name_flag_captured (line 560) | def test_add_name_flag_captured(self): method test_remove_single_produces_list (line 565) | def test_remove_single_produces_list(self): method test_remove_multiple_produces_list (line 569) | def test_remove_multiple_produces_list(self):