Replaces hardcoded preset logic with a clean, maintainable PresetManager architecture. Adds comprehensive deprecation warnings to guide users toward the new --preset flag while maintaining backward compatibility. ## What Changed ### New Files - src/skill_seekers/cli/presets.py (200 lines) * AnalysisPreset dataclass * PRESETS dictionary (quick, standard, comprehensive) * PresetManager class with apply_preset() logic - tests/test_preset_system.py (387 lines) * 24 comprehensive tests across 6 test classes * 100% test pass rate ### Modified Files - src/skill_seekers/cli/parsers/analyze_parser.py * Added --preset flag (recommended way) * Added --preset-list flag * Marked --quick/--comprehensive/--depth as [DEPRECATED] - src/skill_seekers/cli/codebase_scraper.py * Added _check_deprecated_flags() function * Refactored preset handling to use PresetManager * Replaced 28 lines of if-statements with 7 lines of clean code ### Documentation - PHASE4_COMPLETION_SUMMARY.md - Complete implementation summary - PHASE1B_COMPLETION_SUMMARY.md - Phase 1B chunking summary ## Key Features ### Formal Preset Definitions - **Quick** ⚡: 1-2 min, basic features, enhance_level=0 - **Standard** 🎯: 5-10 min, core features, enhance_level=1 (DEFAULT) - **Comprehensive** 🚀: 20-60 min, all features + AI, enhance_level=3 ### New CLI Interface ```bash # Recommended way (no warnings) skill-seekers analyze --directory . --preset quick skill-seekers analyze --directory . --preset standard skill-seekers analyze --directory . --preset comprehensive # Show available presets skill-seekers analyze --preset-list # Customize presets skill-seekers analyze --directory . --preset quick --enhance-level 1 ``` ### Backward Compatibility - Old flags still work: --quick, --comprehensive, --depth - Clear deprecation warnings with migration paths - "Will be removed in v3.0.0" notices ### CLI Override Support Users can customize preset defaults: ```bash skill-seekers analyze --preset quick --skip-patterns false skill-seekers analyze --preset standard --enhance-level 2 ``` ## Testing All tests passing: - 24 preset system tests (test_preset_system.py) - 16 CLI parser tests (test_cli_parsers.py) - 15 upload integration tests (test_upload_integration.py) Total: 55/55 PASS ## Benefits ### Before (Hardcoded) ```python if args.quick: args.depth = "surface" args.skip_patterns = True # ... 13 more assignments elif args.comprehensive: args.depth = "full" # ... 13 more assignments else: # ... 13 more assignments ``` **Problems:** 28 lines, repetitive, hard to maintain ### After (PresetManager) ```python preset_name = args.preset or ("quick" if args.quick else "standard") preset_args = PresetManager.apply_preset(preset_name, vars(args)) for key, value in preset_args.items(): setattr(args, key, value) ``` **Benefits:** 7 lines, clean, maintainable, extensible ## Migration Guide Deprecation warnings guide users: ``` ⚠️ DEPRECATED: --quick → use --preset quick instead ⚠️ DEPRECATED: --comprehensive → use --preset comprehensive instead ⚠️ DEPRECATED: --depth full → use --preset comprehensive instead 💡 MIGRATION TIP: --preset quick (1-2 min, basic features) --preset standard (5-10 min, core features, DEFAULT) --preset comprehensive (20-60 min, all features + AI) ⚠️ Deprecated flags will be removed in v3.0.0 ``` ## Architecture Strategy Pattern implementation: - PresetManager handles preset selection and application - AnalysisPreset dataclass ensures type safety - Factory pattern makes adding new presets easy - CLI overrides provide customization flexibility ## Related Changes Phase 4 is part of the v2.11.0 RAG & CLI improvements: - Phase 1: Chunking Integration ✅ - Phase 2: Upload Integration ✅ - Phase 3: CLI Refactoring ✅ - Phase 4: Preset System ✅ (this commit) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
181 lines
5.8 KiB
Python
181 lines
5.8 KiB
Python
"""Formal preset system for analyze command.
|
|
|
|
Provides predefined analysis configurations with clear trade-offs
|
|
between speed and comprehensiveness.
|
|
"""
|
|
from dataclasses import dataclass
|
|
from typing import Dict, Optional
|
|
|
|
|
|
@dataclass
|
|
class AnalysisPreset:
|
|
"""Analysis preset configuration.
|
|
|
|
Defines a complete analysis configuration including depth,
|
|
feature flags, and AI enhancement level.
|
|
"""
|
|
name: str
|
|
description: str
|
|
depth: str # surface, deep, full
|
|
features: Dict[str, bool] # Feature flags (api_reference, patterns, etc.)
|
|
enhance_level: int # 0=none, 1=SKILL.md, 2=+Arch+Config, 3=full
|
|
estimated_time: str
|
|
icon: str
|
|
|
|
|
|
# Preset definitions
|
|
PRESETS = {
|
|
"quick": AnalysisPreset(
|
|
name="Quick",
|
|
description="Fast basic analysis (1-2 min, essential features only)",
|
|
depth="surface",
|
|
features={
|
|
"api_reference": True, # ON - Essential for API docs
|
|
"dependency_graph": False, # OFF - Slow, not critical for quick
|
|
"patterns": False, # OFF - Slow pattern detection
|
|
"test_examples": False, # OFF - Time-consuming extraction
|
|
"how_to_guides": False, # OFF - Requires AI enhancement
|
|
"config_patterns": False, # OFF - Not critical for quick scan
|
|
"docs": True, # ON - README/docs are essential
|
|
},
|
|
enhance_level=0, # No AI enhancement (fast)
|
|
estimated_time="1-2 minutes",
|
|
icon="⚡"
|
|
),
|
|
|
|
"standard": AnalysisPreset(
|
|
name="Standard",
|
|
description="Balanced analysis (5-10 min, core features, DEFAULT)",
|
|
depth="deep",
|
|
features={
|
|
"api_reference": True, # ON - Core feature
|
|
"dependency_graph": True, # ON - Valuable insights
|
|
"patterns": True, # ON - Design pattern detection
|
|
"test_examples": True, # ON - Real usage examples
|
|
"how_to_guides": False, # OFF - Requires AI (slow)
|
|
"config_patterns": True, # ON - Configuration docs
|
|
"docs": True, # ON - Project documentation
|
|
},
|
|
enhance_level=1, # SKILL.md enhancement only
|
|
estimated_time="5-10 minutes",
|
|
icon="🎯"
|
|
),
|
|
|
|
"comprehensive": AnalysisPreset(
|
|
name="Comprehensive",
|
|
description="Full analysis (20-60 min, all features + AI)",
|
|
depth="full",
|
|
features={
|
|
"api_reference": True, # ON - Complete API docs
|
|
"dependency_graph": True, # ON - Full dependency analysis
|
|
"patterns": True, # ON - All design patterns
|
|
"test_examples": True, # ON - All test examples
|
|
"how_to_guides": True, # ON - AI-generated guides
|
|
"config_patterns": True, # ON - All configuration patterns
|
|
"docs": True, # ON - All project docs
|
|
},
|
|
enhance_level=3, # Full AI enhancement (all features)
|
|
estimated_time="20-60 minutes",
|
|
icon="🚀"
|
|
)
|
|
}
|
|
|
|
|
|
class PresetManager:
|
|
"""Manages analysis presets and applies them to CLI arguments."""
|
|
|
|
@staticmethod
|
|
def get_preset(name: str) -> Optional[AnalysisPreset]:
|
|
"""Get preset by name.
|
|
|
|
Args:
|
|
name: Preset name (case-insensitive)
|
|
|
|
Returns:
|
|
AnalysisPreset if found, None otherwise
|
|
"""
|
|
return PRESETS.get(name.lower())
|
|
|
|
@staticmethod
|
|
def list_presets() -> list[str]:
|
|
"""List available preset names.
|
|
|
|
Returns:
|
|
List of preset names in definition order
|
|
"""
|
|
return list(PRESETS.keys())
|
|
|
|
@staticmethod
|
|
def format_preset_help() -> str:
|
|
"""Format preset help text for CLI.
|
|
|
|
Returns:
|
|
Formatted help text with preset descriptions
|
|
"""
|
|
lines = ["Available presets:"]
|
|
lines.append("")
|
|
for name, preset in PRESETS.items():
|
|
lines.append(f" {preset.icon} {name:15} - {preset.description}")
|
|
lines.append(f" Estimated time: {preset.estimated_time}")
|
|
lines.append(f" Depth: {preset.depth}, AI level: {preset.enhance_level}")
|
|
lines.append("")
|
|
return "\n".join(lines)
|
|
|
|
@staticmethod
|
|
def apply_preset(preset_name: str, args: dict) -> dict:
|
|
"""Apply preset to args, with CLI overrides.
|
|
|
|
Preset defaults are applied first, then CLI arguments override
|
|
specific values. This allows users to customize presets.
|
|
|
|
Args:
|
|
preset_name: Preset to apply
|
|
args: Existing args from CLI (may contain overrides)
|
|
|
|
Returns:
|
|
Updated args with preset applied
|
|
|
|
Raises:
|
|
ValueError: If preset_name is unknown
|
|
"""
|
|
preset = PresetManager.get_preset(preset_name)
|
|
if not preset:
|
|
raise ValueError(f"Unknown preset: {preset_name}")
|
|
|
|
# Start with preset defaults
|
|
updated_args = {
|
|
'depth': preset.depth,
|
|
'enhance_level': preset.enhance_level
|
|
}
|
|
|
|
# Convert feature flags to skip_* arguments
|
|
# feature=False → skip_feature=True (disabled)
|
|
# feature=True → skip_feature=False (enabled)
|
|
for feature, enabled in preset.features.items():
|
|
skip_key = f"skip_{feature.replace('-', '_')}"
|
|
updated_args[skip_key] = not enabled
|
|
|
|
# Apply CLI overrides (CLI takes precedence over preset)
|
|
for key, value in args.items():
|
|
if value is not None: # Only override if explicitly set
|
|
updated_args[key] = value
|
|
|
|
return updated_args
|
|
|
|
@staticmethod
|
|
def get_default_preset() -> str:
|
|
"""Get the default preset name.
|
|
|
|
Returns:
|
|
Default preset name ("standard")
|
|
"""
|
|
return "standard"
|
|
|
|
|
|
# Public API
|
|
__all__ = [
|
|
"AnalysisPreset",
|
|
"PRESETS",
|
|
"PresetManager",
|
|
]
|