Files
skill-seekers-reference/src/skill_seekers/cli/arguments/analyze.py
YusufKaraaslanSpyke 3adc5a8c1d fix: unify scraper argument interface and fix create command forwarding
All scrapers (scrape, github, analyze, pdf) now share a common argument
contract via add_all_standard_arguments() in arguments/common.py.
Universal flags (--dry-run, --verbose, --quiet, --name, --description,
workflow args) work consistently across all source types.

Previously, `create <url> --dry-run`, `create owner/repo --dry-run`,
and `create ./path --dry-run` would crash because sub-scrapers didn't
accept those flags. Also fixes main.py _handle_analyze_command() not
forwarding --dry-run, --preset, --quiet, --name, --description to
codebase_scraper.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 20:56:13 +03:00

187 lines
5.8 KiB
Python

"""Analyze command argument definitions.
This module defines ALL arguments for the analyze command in ONE place.
Both codebase_scraper.py (standalone) and parsers/analyze_parser.py (unified CLI)
import and use these definitions.
Includes preset system support for #268.
Shared arguments (name, description, output, enhance-level, api-key,
dry-run, verbose, quiet, workflow args) come from common.py / workflow.py
via ``add_all_standard_arguments()``.
"""
import argparse
from typing import Any
from .common import add_all_standard_arguments
# Analyze-specific argument definitions as data structure
# NOTE: Shared args (name, description, output, enhance_level, api_key, dry_run,
# verbose, quiet, workflow args) are registered by add_all_standard_arguments().
# The default enhance_level for analyze is 0 (overridden after registration).
ANALYZE_ARGUMENTS: dict[str, dict[str, Any]] = {
# Core options
"directory": {
"flags": ("--directory",),
"kwargs": {
"type": str,
"required": True,
"help": "Directory to analyze",
"metavar": "DIR",
},
},
# Preset system (Issue #268)
"preset": {
"flags": ("--preset",),
"kwargs": {
"type": str,
"choices": ["quick", "standard", "comprehensive"],
"help": "Analysis preset: quick (1-2 min), standard (5-10 min, DEFAULT), comprehensive (20-60 min)",
"metavar": "PRESET",
},
},
"preset_list": {
"flags": ("--preset-list",),
"kwargs": {
"action": "store_true",
"help": "Show available presets and exit",
},
},
# Legacy preset flags (deprecated but kept for backward compatibility)
"quick": {
"flags": ("--quick",),
"kwargs": {
"action": "store_true",
"help": "[DEPRECATED] Quick analysis - use '--preset quick' instead",
},
},
"comprehensive": {
"flags": ("--comprehensive",),
"kwargs": {
"action": "store_true",
"help": "[DEPRECATED] Comprehensive analysis - use '--preset comprehensive' instead",
},
},
# Legacy depth flag (deprecated)
"depth": {
"flags": ("--depth",),
"kwargs": {
"type": str,
"choices": ["surface", "deep", "full"],
"help": "[DEPRECATED] Analysis depth - use --preset instead",
"metavar": "DEPTH",
},
},
# Language and file options
"languages": {
"flags": ("--languages",),
"kwargs": {
"type": str,
"help": "Comma-separated languages (e.g., Python,JavaScript,C++)",
"metavar": "LANGS",
},
},
"file_patterns": {
"flags": ("--file-patterns",),
"kwargs": {
"type": str,
"help": "Comma-separated file patterns",
"metavar": "PATTERNS",
},
},
# Feature skip options
"skip_api_reference": {
"flags": ("--skip-api-reference",),
"kwargs": {
"action": "store_true",
"help": "Skip API docs generation",
},
},
"skip_dependency_graph": {
"flags": ("--skip-dependency-graph",),
"kwargs": {
"action": "store_true",
"help": "Skip dependency graph generation",
},
},
"skip_patterns": {
"flags": ("--skip-patterns",),
"kwargs": {
"action": "store_true",
"help": "Skip pattern detection",
},
},
"skip_test_examples": {
"flags": ("--skip-test-examples",),
"kwargs": {
"action": "store_true",
"help": "Skip test example extraction",
},
},
"skip_how_to_guides": {
"flags": ("--skip-how-to-guides",),
"kwargs": {
"action": "store_true",
"help": "Skip how-to guide generation",
},
},
"skip_config_patterns": {
"flags": ("--skip-config-patterns",),
"kwargs": {
"action": "store_true",
"help": "Skip config pattern extraction",
},
},
"skip_docs": {
"flags": ("--skip-docs",),
"kwargs": {
"action": "store_true",
"help": "Skip project docs (README, docs/)",
},
},
"no_comments": {
"flags": ("--no-comments",),
"kwargs": {
"action": "store_true",
"help": "Skip comment extraction",
},
},
}
def add_analyze_arguments(parser: argparse.ArgumentParser) -> None:
"""Add all analyze command arguments to a parser.
Registers shared args (name, description, output, enhance-level, api-key,
dry-run, verbose, quiet, workflow args) via add_all_standard_arguments(),
then adds analyze-specific args on top.
The default for --enhance-level is overridden to 0 (off) for analyze,
and --output default is set to 'output/codebase/'.
"""
# Shared universal args first
add_all_standard_arguments(parser)
# Override defaults that differ for the analyze command
# enhance-level defaults to 0 (off) for codebase analysis
for action in parser._actions:
if hasattr(action, "dest"):
if action.dest == "enhance_level":
action.default = 0
elif action.dest == "output":
action.default = "output/codebase/"
# Analyze-specific args
for arg_name, arg_def in ANALYZE_ARGUMENTS.items():
flags = arg_def["flags"]
kwargs = arg_def["kwargs"]
parser.add_argument(*flags, **kwargs)
def get_analyze_argument_names() -> set:
"""Get the set of analyze argument destination names."""
from .common import get_all_standard_argument_names
return get_all_standard_argument_names() | set(ANALYZE_ARGUMENTS.keys())