diff --git a/src/skill_seekers/cli/arguments/analyze.py b/src/skill_seekers/cli/arguments/analyze.py index 06930cf..9eab0de 100644 --- a/src/skill_seekers/cli/arguments/analyze.py +++ b/src/skill_seekers/cli/arguments/analyze.py @@ -8,10 +8,9 @@ Includes preset system support for #268. """ import argparse -from typing import Dict, Any +from typing import Any - -ANALYZE_ARGUMENTS: Dict[str, Dict[str, Any]] = { +ANALYZE_ARGUMENTS: dict[str, dict[str, Any]] = { # Core options "directory": { "flags": ("--directory",), @@ -172,7 +171,6 @@ ANALYZE_ARGUMENTS: Dict[str, Dict[str, Any]] = { }, } - def add_analyze_arguments(parser: argparse.ArgumentParser) -> None: """Add all analyze command arguments to a parser.""" for arg_name, arg_def in ANALYZE_ARGUMENTS.items(): @@ -180,7 +178,6 @@ def add_analyze_arguments(parser: argparse.ArgumentParser) -> None: kwargs = arg_def["kwargs"] parser.add_argument(*flags, **kwargs) - def get_analyze_argument_names() -> set: """Get the set of analyze argument destination names.""" return set(ANALYZE_ARGUMENTS.keys()) diff --git a/src/skill_seekers/cli/arguments/common.py b/src/skill_seekers/cli/arguments/common.py index 177f7a8..a580d69 100644 --- a/src/skill_seekers/cli/arguments/common.py +++ b/src/skill_seekers/cli/arguments/common.py @@ -5,12 +5,11 @@ and provide consistent behavior for configuration, output control, and help. """ import argparse -from typing import Dict, Any - +from typing import Any # Common argument definitions as data structure # These are arguments that appear in MULTIPLE commands -COMMON_ARGUMENTS: Dict[str, Dict[str, Any]] = { +COMMON_ARGUMENTS: dict[str, dict[str, Any]] = { "config": { "flags": ("--config", "-c"), "kwargs": { @@ -67,10 +66,9 @@ COMMON_ARGUMENTS: Dict[str, Dict[str, Any]] = { }, } - # RAG (Retrieval-Augmented Generation) arguments # These are shared across commands that support RAG chunking -RAG_ARGUMENTS: Dict[str, Dict[str, Any]] = { +RAG_ARGUMENTS: dict[str, dict[str, Any]] = { "chunk_for_rag": { "flags": ("--chunk-for-rag",), "kwargs": { @@ -98,15 +96,14 @@ RAG_ARGUMENTS: Dict[str, Dict[str, Any]] = { }, } - def add_common_arguments(parser: argparse.ArgumentParser) -> None: """Add common arguments to a parser. - + These arguments are shared across most commands for consistent UX. - + Args: parser: The ArgumentParser to add arguments to - + Example: >>> parser = argparse.ArgumentParser() >>> add_common_arguments(parser) @@ -117,7 +114,6 @@ def add_common_arguments(parser: argparse.ArgumentParser) -> None: kwargs = arg_def["kwargs"] parser.add_argument(*flags, **kwargs) - def get_common_argument_names() -> set: """Get the set of common argument destination names. @@ -126,7 +122,6 @@ def get_common_argument_names() -> set: """ return set(COMMON_ARGUMENTS.keys()) - def add_rag_arguments(parser: argparse.ArgumentParser) -> None: """Add RAG (Retrieval-Augmented Generation) arguments to a parser. @@ -145,7 +140,6 @@ def add_rag_arguments(parser: argparse.ArgumentParser) -> None: kwargs = arg_def["kwargs"] parser.add_argument(*flags, **kwargs) - def get_rag_argument_names() -> set: """Get the set of RAG argument destination names. @@ -154,16 +148,15 @@ def get_rag_argument_names() -> set: """ return set(RAG_ARGUMENTS.keys()) - def get_argument_help(arg_name: str) -> str: """Get the help text for a common argument. - + Args: arg_name: Name of the argument (e.g., 'config') - + Returns: Help text string - + Raises: KeyError: If argument doesn't exist """ diff --git a/src/skill_seekers/cli/arguments/create.py b/src/skill_seekers/cli/arguments/create.py index 18ea0ee..9729a27 100644 --- a/src/skill_seekers/cli/arguments/create.py +++ b/src/skill_seekers/cli/arguments/create.py @@ -10,18 +10,17 @@ This enables progressive disclosure in help text while maintaining """ import argparse -from typing import Dict, Any, Set, List +from typing import Any from skill_seekers.cli.constants import DEFAULT_RATE_LIMIT from .common import RAG_ARGUMENTS - # ============================================================================= # TIER 1: UNIVERSAL ARGUMENTS (15 flags) # ============================================================================= # These arguments work for ALL source types -UNIVERSAL_ARGUMENTS: Dict[str, Dict[str, Any]] = { +UNIVERSAL_ARGUMENTS: dict[str, dict[str, Any]] = { # Identity arguments "name": { "flags": ("--name",), @@ -118,13 +117,12 @@ UNIVERSAL_ARGUMENTS: Dict[str, Dict[str, Any]] = { # Merge RAG arguments from common.py into universal arguments UNIVERSAL_ARGUMENTS.update(RAG_ARGUMENTS) - # ============================================================================= # TIER 2: SOURCE-SPECIFIC ARGUMENTS # ============================================================================= # Web scraping specific (from scrape.py) -WEB_ARGUMENTS: Dict[str, Dict[str, Any]] = { +WEB_ARGUMENTS: dict[str, dict[str, Any]] = { "url": { "flags": ("--url",), "kwargs": { @@ -189,7 +187,7 @@ WEB_ARGUMENTS: Dict[str, Dict[str, Any]] = { } # GitHub repository specific (from github.py) -GITHUB_ARGUMENTS: Dict[str, Dict[str, Any]] = { +GITHUB_ARGUMENTS: dict[str, dict[str, Any]] = { "repo": { "flags": ("--repo",), "kwargs": { @@ -261,7 +259,7 @@ GITHUB_ARGUMENTS: Dict[str, Dict[str, Any]] = { } # Local codebase specific (from analyze.py) -LOCAL_ARGUMENTS: Dict[str, Dict[str, Any]] = { +LOCAL_ARGUMENTS: dict[str, dict[str, Any]] = { "directory": { "flags": ("--directory",), "kwargs": { @@ -324,7 +322,7 @@ LOCAL_ARGUMENTS: Dict[str, Dict[str, Any]] = { } # PDF specific (from pdf.py) -PDF_ARGUMENTS: Dict[str, Dict[str, Any]] = { +PDF_ARGUMENTS: dict[str, dict[str, Any]] = { "pdf": { "flags": ("--pdf",), "kwargs": { @@ -350,13 +348,12 @@ PDF_ARGUMENTS: Dict[str, Dict[str, Any]] = { }, } - # ============================================================================= # TIER 3: ADVANCED/RARE ARGUMENTS # ============================================================================= # Hidden from default help, shown only with --help-advanced -ADVANCED_ARGUMENTS: Dict[str, Dict[str, Any]] = { +ADVANCED_ARGUMENTS: dict[str, dict[str, Any]] = { "no_rate_limit": { "flags": ("--no-rate-limit",), "kwargs": { @@ -387,17 +384,15 @@ ADVANCED_ARGUMENTS: Dict[str, Dict[str, Any]] = { }, } - # ============================================================================= # HELPER FUNCTIONS # ============================================================================= -def get_universal_argument_names() -> Set[str]: +def get_universal_argument_names() -> set[str]: """Get set of universal argument names.""" return set(UNIVERSAL_ARGUMENTS.keys()) - -def get_source_specific_arguments(source_type: str) -> Dict[str, Dict[str, Any]]: +def get_source_specific_arguments(source_type: str) -> dict[str, dict[str, Any]]: """Get source-specific arguments for a given source type. Args: @@ -406,21 +401,16 @@ def get_source_specific_arguments(source_type: str) -> Dict[str, Dict[str, Any]] Returns: Dict of argument definitions """ - if source_type == 'web': - return WEB_ARGUMENTS - elif source_type == 'github': - return GITHUB_ARGUMENTS - elif source_type == 'local': - return LOCAL_ARGUMENTS - elif source_type == 'pdf': - return PDF_ARGUMENTS - elif source_type == 'config': - return {} # Config files don't have extra args - else: - return {} + source_args = { + 'web': WEB_ARGUMENTS, + 'github': GITHUB_ARGUMENTS, + 'local': LOCAL_ARGUMENTS, + 'pdf': PDF_ARGUMENTS, + 'config': {}, # Config files don't have extra args + } + return source_args.get(source_type, {}) - -def get_compatible_arguments(source_type: str) -> List[str]: +def get_compatible_arguments(source_type: str) -> list[str]: """Get list of compatible argument names for a source type. Args: @@ -441,7 +431,6 @@ def get_compatible_arguments(source_type: str) -> List[str]: return compatible - def add_create_arguments(parser: argparse.ArgumentParser, mode: str = 'default') -> None: """Add create command arguments to parser. diff --git a/src/skill_seekers/cli/arguments/enhance.py b/src/skill_seekers/cli/arguments/enhance.py index c1b5cb0..753c8ca 100644 --- a/src/skill_seekers/cli/arguments/enhance.py +++ b/src/skill_seekers/cli/arguments/enhance.py @@ -6,10 +6,9 @@ import and use these definitions. """ import argparse -from typing import Dict, Any +from typing import Any - -ENHANCE_ARGUMENTS: Dict[str, Dict[str, Any]] = { +ENHANCE_ARGUMENTS: dict[str, dict[str, Any]] = { # Positional argument "skill_directory": { "flags": ("skill_directory",), @@ -69,7 +68,6 @@ ENHANCE_ARGUMENTS: Dict[str, Dict[str, Any]] = { }, } - def add_enhance_arguments(parser: argparse.ArgumentParser) -> None: """Add all enhance command arguments to a parser.""" for arg_name, arg_def in ENHANCE_ARGUMENTS.items(): diff --git a/src/skill_seekers/cli/arguments/github.py b/src/skill_seekers/cli/arguments/github.py index 31517a6..e660f1e 100644 --- a/src/skill_seekers/cli/arguments/github.py +++ b/src/skill_seekers/cli/arguments/github.py @@ -8,11 +8,10 @@ This ensures the parsers NEVER drift out of sync. """ import argparse -from typing import Dict, Any - +from typing import Any # GitHub-specific argument definitions as data structure -GITHUB_ARGUMENTS: Dict[str, Dict[str, Any]] = { +GITHUB_ARGUMENTS: dict[str, dict[str, Any]] = { # Core GitHub options "repo": { "flags": ("--repo",), @@ -134,18 +133,17 @@ GITHUB_ARGUMENTS: Dict[str, Dict[str, Any]] = { }, } - def add_github_arguments(parser: argparse.ArgumentParser) -> None: """Add all github command arguments to a parser. - + This is the SINGLE SOURCE OF TRUTH for github arguments. Used by: - github_scraper.py (standalone scraper) - parsers/github_parser.py (unified CLI) - + Args: parser: The ArgumentParser to add arguments to - + Example: >>> parser = argparse.ArgumentParser() >>> add_github_arguments(parser) # Adds all github args @@ -155,19 +153,17 @@ def add_github_arguments(parser: argparse.ArgumentParser) -> None: kwargs = arg_def["kwargs"] parser.add_argument(*flags, **kwargs) - def get_github_argument_names() -> set: """Get the set of github argument destination names. - + Returns: Set of argument dest names """ return set(GITHUB_ARGUMENTS.keys()) - def get_github_argument_count() -> int: """Get the total number of github arguments. - + Returns: Number of arguments """ diff --git a/src/skill_seekers/cli/arguments/package.py b/src/skill_seekers/cli/arguments/package.py index 18d3df0..c3c6eab 100644 --- a/src/skill_seekers/cli/arguments/package.py +++ b/src/skill_seekers/cli/arguments/package.py @@ -6,10 +6,9 @@ import and use these definitions. """ import argparse -from typing import Dict, Any +from typing import Any - -PACKAGE_ARGUMENTS: Dict[str, Dict[str, Any]] = { +PACKAGE_ARGUMENTS: dict[str, dict[str, Any]] = { # Positional argument "skill_directory": { "flags": ("skill_directory",), @@ -124,7 +123,6 @@ PACKAGE_ARGUMENTS: Dict[str, Dict[str, Any]] = { }, } - def add_package_arguments(parser: argparse.ArgumentParser) -> None: """Add all package command arguments to a parser.""" for arg_name, arg_def in PACKAGE_ARGUMENTS.items(): diff --git a/src/skill_seekers/cli/arguments/pdf.py b/src/skill_seekers/cli/arguments/pdf.py index 9cc0154..7af93fe 100644 --- a/src/skill_seekers/cli/arguments/pdf.py +++ b/src/skill_seekers/cli/arguments/pdf.py @@ -6,10 +6,9 @@ import and use these definitions. """ import argparse -from typing import Dict, Any +from typing import Any - -PDF_ARGUMENTS: Dict[str, Dict[str, Any]] = { +PDF_ARGUMENTS: dict[str, dict[str, Any]] = { "config": { "flags": ("--config",), "kwargs": { @@ -52,7 +51,6 @@ PDF_ARGUMENTS: Dict[str, Dict[str, Any]] = { }, } - def add_pdf_arguments(parser: argparse.ArgumentParser) -> None: """Add all pdf command arguments to a parser.""" for arg_name, arg_def in PDF_ARGUMENTS.items(): diff --git a/src/skill_seekers/cli/arguments/scrape.py b/src/skill_seekers/cli/arguments/scrape.py index 963d925..9c5c976 100644 --- a/src/skill_seekers/cli/arguments/scrape.py +++ b/src/skill_seekers/cli/arguments/scrape.py @@ -8,15 +8,14 @@ This ensures the parsers NEVER drift out of sync. """ import argparse -from typing import Dict, Any +from typing import Any from skill_seekers.cli.constants import DEFAULT_RATE_LIMIT from .common import RAG_ARGUMENTS - # Scrape-specific argument definitions as data structure # This enables introspection for UI generation and testing -SCRAPE_ARGUMENTS: Dict[str, Dict[str, Any]] = { +SCRAPE_ARGUMENTS: dict[str, dict[str, Any]] = { # Positional argument "url_positional": { "flags": ("url",), @@ -199,18 +198,17 @@ SCRAPE_ARGUMENTS: Dict[str, Dict[str, Any]] = { # Merge RAG arguments from common.py SCRAPE_ARGUMENTS.update(RAG_ARGUMENTS) - def add_scrape_arguments(parser: argparse.ArgumentParser) -> None: """Add all scrape command arguments to a parser. - + This is the SINGLE SOURCE OF TRUTH for scrape arguments. Used by: - doc_scraper.py (standalone scraper) - parsers/scrape_parser.py (unified CLI) - + Args: parser: The ArgumentParser to add arguments to - + Example: >>> parser = argparse.ArgumentParser() >>> add_scrape_arguments(parser) # Adds all 26 scrape args @@ -220,19 +218,17 @@ def add_scrape_arguments(parser: argparse.ArgumentParser) -> None: kwargs = arg_def["kwargs"] parser.add_argument(*flags, **kwargs) - def get_scrape_argument_names() -> set: """Get the set of scrape argument destination names. - + Returns: Set of argument dest names """ return set(SCRAPE_ARGUMENTS.keys()) - def get_scrape_argument_count() -> int: """Get the total number of scrape arguments. - + Returns: Number of arguments """ diff --git a/src/skill_seekers/cli/arguments/unified.py b/src/skill_seekers/cli/arguments/unified.py index 6ad41ad..7c56a60 100644 --- a/src/skill_seekers/cli/arguments/unified.py +++ b/src/skill_seekers/cli/arguments/unified.py @@ -6,10 +6,9 @@ import and use these definitions. """ import argparse -from typing import Dict, Any +from typing import Any - -UNIFIED_ARGUMENTS: Dict[str, Dict[str, Any]] = { +UNIFIED_ARGUMENTS: dict[str, dict[str, Any]] = { "config": { "flags": ("--config", "-c"), "kwargs": { @@ -43,7 +42,6 @@ UNIFIED_ARGUMENTS: Dict[str, Dict[str, Any]] = { }, } - def add_unified_arguments(parser: argparse.ArgumentParser) -> None: """Add all unified command arguments to a parser.""" for arg_name, arg_def in UNIFIED_ARGUMENTS.items(): diff --git a/src/skill_seekers/cli/arguments/upload.py b/src/skill_seekers/cli/arguments/upload.py index 72b3ab3..9192199 100644 --- a/src/skill_seekers/cli/arguments/upload.py +++ b/src/skill_seekers/cli/arguments/upload.py @@ -6,10 +6,9 @@ import and use these definitions. """ import argparse -from typing import Dict, Any +from typing import Any - -UPLOAD_ARGUMENTS: Dict[str, Dict[str, Any]] = { +UPLOAD_ARGUMENTS: dict[str, dict[str, Any]] = { # Positional argument "package_file": { "flags": ("package_file",), @@ -99,7 +98,6 @@ UPLOAD_ARGUMENTS: Dict[str, Dict[str, Any]] = { }, } - def add_upload_arguments(parser: argparse.ArgumentParser) -> None: """Add all upload command arguments to a parser.""" for arg_name, arg_def in UPLOAD_ARGUMENTS.items(): diff --git a/src/skill_seekers/cli/create_command.py b/src/skill_seekers/cli/create_command.py index 9783af6..c61fc74 100644 --- a/src/skill_seekers/cli/create_command.py +++ b/src/skill_seekers/cli/create_command.py @@ -7,7 +7,6 @@ to appropriate scraper while maintaining full backward compatibility. import sys import logging import argparse -from typing import List, Optional from skill_seekers.cli.source_detector import SourceDetector, SourceInfo from skill_seekers.cli.arguments.create import ( @@ -17,7 +16,6 @@ from skill_seekers.cli.arguments.create import ( logger = logging.getLogger(__name__) - class CreateCommand: """Unified create command implementation.""" @@ -28,7 +26,7 @@ class CreateCommand: args: Parsed command-line arguments """ self.args = args - self.source_info: Optional[SourceInfo] = None + self.source_info: SourceInfo | None = None def execute(self) -> int: """Execute the create command. @@ -311,7 +309,7 @@ class CreateCommand: finally: sys.argv = original_argv - def _add_common_args(self, argv: List[str]) -> None: + def _add_common_args(self, argv: list[str]) -> None: """Add common/universal arguments to argv list. Args: @@ -367,7 +365,6 @@ class CreateCommand: if getattr(self.args, 'interactive_enhancement', False): argv.append('--interactive-enhancement') - def main() -> int: """Entry point for create command. @@ -510,6 +507,5 @@ Common Workflows: command = CreateCommand(args) return command.execute() - if __name__ == '__main__': sys.exit(main()) diff --git a/src/skill_seekers/cli/github_scraper.py b/src/skill_seekers/cli/github_scraper.py index 3a34a21..c209852 100644 --- a/src/skill_seekers/cli/github_scraper.py +++ b/src/skill_seekers/cli/github_scraper.py @@ -21,7 +21,7 @@ import os import re import sys from pathlib import Path -from typing import Any, Optional +from typing import Any try: from github import Github, GithubException, Repository @@ -100,7 +100,6 @@ EXCLUDED_DIRS = { ".tmp", } - def extract_description_from_readme(readme_content: str, repo_name: str) -> str: """ Extract a meaningful description from README content for skill description. @@ -181,7 +180,6 @@ def extract_description_from_readme(readme_content: str, repo_name: str) -> str: project_name = repo_name.split("/")[-1] return f"Use when working with {project_name}" - class GitHubScraper: """ GitHub Repository Scraper (C1.1-C1.9) @@ -563,7 +561,7 @@ class GitHubScraper: return False - def _load_gitignore(self) -> Optional["pathspec.PathSpec"]: + def _load_gitignore(self) -> "pathspec.PathSpec" | None: """ Load .gitignore file and create pathspec matcher (C2.1). @@ -894,7 +892,6 @@ class GitHubScraper: logger.info(f"Data saved to: {self.data_file}") - class GitHubToSkillConverter: """ Convert extracted GitHub data to Claude skill format (C1.10). @@ -1350,14 +1347,13 @@ Use this skill when you need to: f.write(content) logger.info(f"Generated: {structure_path}") - def setup_argument_parser() -> argparse.ArgumentParser: """Setup and configure command-line argument parser. - + Creates an ArgumentParser with all CLI options for the github scraper. All arguments are defined in skill_seekers.cli.arguments.github to ensure consistency between the standalone scraper and unified CLI. - + Returns: argparse.ArgumentParser: Configured argument parser """ @@ -1378,7 +1374,6 @@ Examples: return parser - def main(): """C1.10: CLI tool entry point.""" parser = setup_argument_parser() @@ -1476,6 +1471,5 @@ def main(): logger.error(f"Error: {e}") sys.exit(1) - if __name__ == "__main__": main() diff --git a/src/skill_seekers/cli/parsers/__init__.py b/src/skill_seekers/cli/parsers/__init__.py index f9d392b..c4737c3 100644 --- a/src/skill_seekers/cli/parsers/__init__.py +++ b/src/skill_seekers/cli/parsers/__init__.py @@ -28,7 +28,6 @@ from .update_parser import UpdateParser from .multilang_parser import MultilangParser from .quality_parser import QualityParser - # Registry of all parsers (in order of usage frequency) PARSERS = [ CreateParser(), # NEW: Unified create command (placed first for prominence) @@ -53,7 +52,6 @@ PARSERS = [ QualityParser(), ] - def register_parsers(subparsers): """Register all subcommand parsers. @@ -66,7 +64,6 @@ def register_parsers(subparsers): for parser_instance in PARSERS: parser_instance.create_parser(subparsers) - def get_parser_names(): """Get list of all subcommand names. @@ -75,7 +72,6 @@ def get_parser_names(): """ return [p.name for p in PARSERS] - __all__ = [ "SubcommandParser", "PARSERS", diff --git a/src/skill_seekers/cli/parsers/analyze_parser.py b/src/skill_seekers/cli/parsers/analyze_parser.py index db52200..897e302 100644 --- a/src/skill_seekers/cli/parsers/analyze_parser.py +++ b/src/skill_seekers/cli/parsers/analyze_parser.py @@ -9,7 +9,6 @@ Includes preset system support (Issue #268). from .base import SubcommandParser from skill_seekers.cli.arguments.analyze import add_analyze_arguments - class AnalyzeParser(SubcommandParser): """Parser for analyze subcommand.""" @@ -27,10 +26,10 @@ class AnalyzeParser(SubcommandParser): def add_arguments(self, parser): """Add analyze-specific arguments. - + Uses shared argument definitions to ensure consistency with codebase_scraper.py (standalone scraper). - + Includes preset system for simplified UX. """ add_analyze_arguments(parser) diff --git a/src/skill_seekers/cli/parsers/base.py b/src/skill_seekers/cli/parsers/base.py index 765cf01..45e57ad 100644 --- a/src/skill_seekers/cli/parsers/base.py +++ b/src/skill_seekers/cli/parsers/base.py @@ -3,7 +3,6 @@ from abc import ABC, abstractmethod import argparse - class SubcommandParser(ABC): """Base class for subcommand parsers. diff --git a/src/skill_seekers/cli/parsers/config_parser.py b/src/skill_seekers/cli/parsers/config_parser.py index f78c36e..d46aba0 100644 --- a/src/skill_seekers/cli/parsers/config_parser.py +++ b/src/skill_seekers/cli/parsers/config_parser.py @@ -2,7 +2,6 @@ from .base import SubcommandParser - class ConfigParser(SubcommandParser): """Parser for config subcommand.""" diff --git a/src/skill_seekers/cli/parsers/create_parser.py b/src/skill_seekers/cli/parsers/create_parser.py index 1f0244c..e1f59a9 100644 --- a/src/skill_seekers/cli/parsers/create_parser.py +++ b/src/skill_seekers/cli/parsers/create_parser.py @@ -13,7 +13,6 @@ import argparse from .base import SubcommandParser from skill_seekers.cli.arguments.create import add_create_arguments - class CreateParser(SubcommandParser): """Parser for create subcommand with multi-mode help.""" diff --git a/src/skill_seekers/cli/parsers/enhance_parser.py b/src/skill_seekers/cli/parsers/enhance_parser.py index 6bfe51d..bd15163 100644 --- a/src/skill_seekers/cli/parsers/enhance_parser.py +++ b/src/skill_seekers/cli/parsers/enhance_parser.py @@ -7,7 +7,6 @@ consistency with the standalone enhance_skill_local module. from .base import SubcommandParser from skill_seekers.cli.arguments.enhance import add_enhance_arguments - class EnhanceParser(SubcommandParser): """Parser for enhance subcommand.""" @@ -25,7 +24,7 @@ class EnhanceParser(SubcommandParser): def add_arguments(self, parser): """Add enhance-specific arguments. - + Uses shared argument definitions to ensure consistency with enhance_skill_local.py (standalone enhancer). """ diff --git a/src/skill_seekers/cli/parsers/enhance_status_parser.py b/src/skill_seekers/cli/parsers/enhance_status_parser.py index 229098c..119ba31 100644 --- a/src/skill_seekers/cli/parsers/enhance_status_parser.py +++ b/src/skill_seekers/cli/parsers/enhance_status_parser.py @@ -2,7 +2,6 @@ from .base import SubcommandParser - class EnhanceStatusParser(SubcommandParser): """Parser for enhance-status subcommand.""" diff --git a/src/skill_seekers/cli/parsers/estimate_parser.py b/src/skill_seekers/cli/parsers/estimate_parser.py index 5a21bdc..e699058 100644 --- a/src/skill_seekers/cli/parsers/estimate_parser.py +++ b/src/skill_seekers/cli/parsers/estimate_parser.py @@ -2,7 +2,6 @@ from .base import SubcommandParser - class EstimateParser(SubcommandParser): """Parser for estimate subcommand.""" diff --git a/src/skill_seekers/cli/parsers/github_parser.py b/src/skill_seekers/cli/parsers/github_parser.py index 742c097..e7ea2f7 100644 --- a/src/skill_seekers/cli/parsers/github_parser.py +++ b/src/skill_seekers/cli/parsers/github_parser.py @@ -7,7 +7,6 @@ consistency with the standalone github_scraper module. from .base import SubcommandParser from skill_seekers.cli.arguments.github import add_github_arguments - class GitHubParser(SubcommandParser): """Parser for github subcommand.""" @@ -25,7 +24,7 @@ class GitHubParser(SubcommandParser): def add_arguments(self, parser): """Add github-specific arguments. - + Uses shared argument definitions to ensure consistency with github_scraper.py (standalone scraper). """ diff --git a/src/skill_seekers/cli/parsers/install_agent_parser.py b/src/skill_seekers/cli/parsers/install_agent_parser.py index 884d56e..dcc1803 100644 --- a/src/skill_seekers/cli/parsers/install_agent_parser.py +++ b/src/skill_seekers/cli/parsers/install_agent_parser.py @@ -2,7 +2,6 @@ from .base import SubcommandParser - class InstallAgentParser(SubcommandParser): """Parser for install-agent subcommand.""" diff --git a/src/skill_seekers/cli/parsers/install_parser.py b/src/skill_seekers/cli/parsers/install_parser.py index 3d48e6d..6bb06e8 100644 --- a/src/skill_seekers/cli/parsers/install_parser.py +++ b/src/skill_seekers/cli/parsers/install_parser.py @@ -2,7 +2,6 @@ from .base import SubcommandParser - class InstallParser(SubcommandParser): """Parser for install subcommand.""" diff --git a/src/skill_seekers/cli/parsers/multilang_parser.py b/src/skill_seekers/cli/parsers/multilang_parser.py index 68bdb55..2de4c8f 100644 --- a/src/skill_seekers/cli/parsers/multilang_parser.py +++ b/src/skill_seekers/cli/parsers/multilang_parser.py @@ -2,7 +2,6 @@ from .base import SubcommandParser - class MultilangParser(SubcommandParser): """Parser for multilang subcommand.""" diff --git a/src/skill_seekers/cli/parsers/package_parser.py b/src/skill_seekers/cli/parsers/package_parser.py index f6cc0c3..0511459 100644 --- a/src/skill_seekers/cli/parsers/package_parser.py +++ b/src/skill_seekers/cli/parsers/package_parser.py @@ -7,7 +7,6 @@ consistency with the standalone package_skill module. from .base import SubcommandParser from skill_seekers.cli.arguments.package import add_package_arguments - class PackageParser(SubcommandParser): """Parser for package subcommand.""" @@ -25,7 +24,7 @@ class PackageParser(SubcommandParser): def add_arguments(self, parser): """Add package-specific arguments. - + Uses shared argument definitions to ensure consistency with package_skill.py (standalone packager). """ diff --git a/src/skill_seekers/cli/parsers/pdf_parser.py b/src/skill_seekers/cli/parsers/pdf_parser.py index 503b476..3c9f0d6 100644 --- a/src/skill_seekers/cli/parsers/pdf_parser.py +++ b/src/skill_seekers/cli/parsers/pdf_parser.py @@ -7,7 +7,6 @@ consistency with the standalone pdf_scraper module. from .base import SubcommandParser from skill_seekers.cli.arguments.pdf import add_pdf_arguments - class PDFParser(SubcommandParser): """Parser for pdf subcommand.""" @@ -25,7 +24,7 @@ class PDFParser(SubcommandParser): def add_arguments(self, parser): """Add pdf-specific arguments. - + Uses shared argument definitions to ensure consistency with pdf_scraper.py (standalone scraper). """ diff --git a/src/skill_seekers/cli/parsers/quality_parser.py b/src/skill_seekers/cli/parsers/quality_parser.py index 69803fe..e394cba 100644 --- a/src/skill_seekers/cli/parsers/quality_parser.py +++ b/src/skill_seekers/cli/parsers/quality_parser.py @@ -2,7 +2,6 @@ from .base import SubcommandParser - class QualityParser(SubcommandParser): """Parser for quality subcommand.""" diff --git a/src/skill_seekers/cli/parsers/resume_parser.py b/src/skill_seekers/cli/parsers/resume_parser.py index 9bb5d07..f024d2a 100644 --- a/src/skill_seekers/cli/parsers/resume_parser.py +++ b/src/skill_seekers/cli/parsers/resume_parser.py @@ -2,7 +2,6 @@ from .base import SubcommandParser - class ResumeParser(SubcommandParser): """Parser for resume subcommand.""" diff --git a/src/skill_seekers/cli/parsers/scrape_parser.py b/src/skill_seekers/cli/parsers/scrape_parser.py index 8b686fe..83cbea9 100644 --- a/src/skill_seekers/cli/parsers/scrape_parser.py +++ b/src/skill_seekers/cli/parsers/scrape_parser.py @@ -7,7 +7,6 @@ consistency with the standalone doc_scraper module. from .base import SubcommandParser from skill_seekers.cli.arguments.scrape import add_scrape_arguments - class ScrapeParser(SubcommandParser): """Parser for scrape subcommand.""" @@ -25,7 +24,7 @@ class ScrapeParser(SubcommandParser): def add_arguments(self, parser): """Add scrape-specific arguments. - + Uses shared argument definitions to ensure consistency with doc_scraper.py (standalone scraper). """ diff --git a/src/skill_seekers/cli/parsers/stream_parser.py b/src/skill_seekers/cli/parsers/stream_parser.py index 6ee513a..79f7cfc 100644 --- a/src/skill_seekers/cli/parsers/stream_parser.py +++ b/src/skill_seekers/cli/parsers/stream_parser.py @@ -2,7 +2,6 @@ from .base import SubcommandParser - class StreamParser(SubcommandParser): """Parser for stream subcommand.""" diff --git a/src/skill_seekers/cli/parsers/test_examples_parser.py b/src/skill_seekers/cli/parsers/test_examples_parser.py index da2bde9..68df0ed 100644 --- a/src/skill_seekers/cli/parsers/test_examples_parser.py +++ b/src/skill_seekers/cli/parsers/test_examples_parser.py @@ -2,7 +2,6 @@ from .base import SubcommandParser - class TestExamplesParser(SubcommandParser): """Parser for extract-test-examples subcommand.""" diff --git a/src/skill_seekers/cli/parsers/unified_parser.py b/src/skill_seekers/cli/parsers/unified_parser.py index f5eec9a..c6ee77a 100644 --- a/src/skill_seekers/cli/parsers/unified_parser.py +++ b/src/skill_seekers/cli/parsers/unified_parser.py @@ -7,7 +7,6 @@ consistency with the standalone unified_scraper module. from .base import SubcommandParser from skill_seekers.cli.arguments.unified import add_unified_arguments - class UnifiedParser(SubcommandParser): """Parser for unified subcommand.""" @@ -25,7 +24,7 @@ class UnifiedParser(SubcommandParser): def add_arguments(self, parser): """Add unified-specific arguments. - + Uses shared argument definitions to ensure consistency with unified_scraper.py (standalone scraper). """ diff --git a/src/skill_seekers/cli/parsers/update_parser.py b/src/skill_seekers/cli/parsers/update_parser.py index eaa321a..46711f4 100644 --- a/src/skill_seekers/cli/parsers/update_parser.py +++ b/src/skill_seekers/cli/parsers/update_parser.py @@ -2,7 +2,6 @@ from .base import SubcommandParser - class UpdateParser(SubcommandParser): """Parser for update subcommand.""" diff --git a/src/skill_seekers/cli/parsers/upload_parser.py b/src/skill_seekers/cli/parsers/upload_parser.py index 09006d3..4aff69c 100644 --- a/src/skill_seekers/cli/parsers/upload_parser.py +++ b/src/skill_seekers/cli/parsers/upload_parser.py @@ -7,7 +7,6 @@ consistency with the standalone upload_skill module. from .base import SubcommandParser from skill_seekers.cli.arguments.upload import add_upload_arguments - class UploadParser(SubcommandParser): """Parser for upload subcommand.""" @@ -25,7 +24,7 @@ class UploadParser(SubcommandParser): def add_arguments(self, parser): """Add upload-specific arguments. - + Uses shared argument definitions to ensure consistency with upload_skill.py (standalone uploader). """ diff --git a/src/skill_seekers/cli/presets/__init__.py b/src/skill_seekers/cli/presets/__init__.py index 386f33a..3fccef7 100644 --- a/src/skill_seekers/cli/presets/__init__.py +++ b/src/skill_seekers/cli/presets/__init__.py @@ -20,7 +20,6 @@ from .manager import ( # Analyze presets from .analyze_presets import ( - AnalysisPreset as AnalyzeAnalysisPreset, # Alternative version (without enhance_level) ANALYZE_PRESETS, apply_analyze_preset, get_preset_help_text, diff --git a/src/skill_seekers/cli/presets/analyze_presets.py b/src/skill_seekers/cli/presets/analyze_presets.py index a3f3548..a2949fe 100644 --- a/src/skill_seekers/cli/presets/analyze_presets.py +++ b/src/skill_seekers/cli/presets/analyze_presets.py @@ -12,17 +12,16 @@ Examples: """ from dataclasses import dataclass, field -from typing import Dict, Optional -import argparse +import argparse @dataclass(frozen=True) class AnalysisPreset: """Definition of an analysis preset. - + Presets control analysis depth and features ONLY. AI Enhancement is controlled separately via --enhance or --enhance-level. - + Attributes: name: Human-readable preset name description: Brief description of what this preset does @@ -33,10 +32,9 @@ class AnalysisPreset: name: str description: str depth: str - features: Dict[str, bool] = field(default_factory=dict) + features: dict[str, bool] = field(default_factory=dict) estimated_time: str = "" - # Preset definitions ANALYZE_PRESETS = { "quick": AnalysisPreset( @@ -53,7 +51,7 @@ ANALYZE_PRESETS = { }, estimated_time="1-2 minutes" ), - + "standard": AnalysisPreset( name="Standard", description="Balanced analysis with core features (recommended)", @@ -68,7 +66,7 @@ ANALYZE_PRESETS = { }, estimated_time="5-10 minutes" ), - + "comprehensive": AnalysisPreset( name="Comprehensive", description="Full analysis with all features", @@ -85,21 +83,20 @@ ANALYZE_PRESETS = { ), } - def apply_analyze_preset(args: argparse.Namespace, preset_name: str) -> None: """Apply an analysis preset to the args namespace. - + This modifies the args object to set the preset's depth and feature flags. NOTE: This does NOT set enhance_level - that's controlled separately via --enhance or --enhance-level flags. - + Args: args: The argparse.Namespace to modify preset_name: Name of the preset to apply - + Raises: KeyError: If preset_name is not a valid preset - + Example: >>> args = parser.parse_args(['--directory', '.', '--preset', 'quick']) >>> apply_analyze_preset(args, args.preset) @@ -107,22 +104,21 @@ def apply_analyze_preset(args: argparse.Namespace, preset_name: str) -> None: >>> # enhance_level is still 0 (default) unless --enhance was specified """ preset = ANALYZE_PRESETS[preset_name] - + # Set depth args.depth = preset.depth - + # Set feature flags (skip_* attributes) for feature, enabled in preset.features.items(): skip_attr = f"skip_{feature}" setattr(args, skip_attr, not enabled) - def get_preset_help_text(preset_name: str) -> str: """Get formatted help text for a preset. - + Args: preset_name: Name of the preset - + Returns: Formatted help string """ @@ -133,29 +129,28 @@ def get_preset_help_text(preset_name: str) -> str: f" Depth: {preset.depth}" ) - def show_preset_list() -> None: """Print the list of available presets to stdout. - + This is used by the --preset-list flag. """ print("\nAvailable Analysis Presets") print("=" * 60) print() - + for name, preset in ANALYZE_PRESETS.items(): marker = " (DEFAULT)" if name == "standard" else "" print(f" {name}{marker}") print(f" {preset.description}") print(f" Estimated time: {preset.estimated_time}") print(f" Depth: {preset.depth}") - + # Show enabled features enabled = [f for f, v in preset.features.items() if v] if enabled: print(f" Features: {', '.join(enabled)}") print() - + print("AI Enhancement (separate from presets):") print(" --enhance Enable AI enhancement (default level 1)") print(" --enhance-level N Set AI enhancement level (0-3)") @@ -166,91 +161,88 @@ def show_preset_list() -> None: print(" skill-seekers analyze --directory