From 7e9b52f425b2f802c48bd40351b6b9bfedaf9c07 Mon Sep 17 00:00:00 2001 From: yusyus Date: Sun, 15 Feb 2026 19:22:59 +0300 Subject: [PATCH] feat(cli): Add -p shortcut and improve create command help text Implemented Kimi's feedback suggestions: 1. Added -p shortcut for --preset flag - Makes presets easier to use: -p quick, -p standard, -p comprehensive - Updated create arguments to include "-p" in flags tuple 2. Improved help text formatting - Simplified description to avoid excessive wrapping - Made examples more concise and scannable - Custom NoWrapFormatter for better readability - Reduced verbosity while maintaining clarity Changes: - arguments/create.py: Added "-p" to preset flags - create_command.py: Updated epilog with NoWrapFormatter - parsers/create_parser.py: Simplified description, override register() User Impact: - Faster preset usage: "skill-seekers create -p quick" - Cleaner help output - Better UX for frequently-used preset flag Co-Authored-By: Claude Sonnet 4.5 --- src/skill_seekers/cli/arguments/create.py | 2 +- src/skill_seekers/cli/create_command.py | 81 ++++++++----------- .../cli/parsers/create_parser.py | 57 ++++++++----- 3 files changed, 72 insertions(+), 68 deletions(-) diff --git a/src/skill_seekers/cli/arguments/create.py b/src/skill_seekers/cli/arguments/create.py index 4408729..18ea0ee 100644 --- a/src/skill_seekers/cli/arguments/create.py +++ b/src/skill_seekers/cli/arguments/create.py @@ -96,7 +96,7 @@ UNIVERSAL_ARGUMENTS: Dict[str, Dict[str, Any]] = { # Note: RAG arguments are merged into UNIVERSAL_ARGUMENTS at runtime # Preset system "preset": { - "flags": ("--preset",), + "flags": ("--preset", "-p"), "kwargs": { "type": str, "choices": ["quick", "standard", "comprehensive"], diff --git a/src/skill_seekers/cli/create_command.py b/src/skill_seekers/cli/create_command.py index 72f75b9..9783af6 100644 --- a/src/skill_seekers/cli/create_command.py +++ b/src/skill_seekers/cli/create_command.py @@ -374,65 +374,52 @@ def main() -> int: Returns: Exit code (0 for success, non-zero for error) """ + import textwrap from skill_seekers.cli.arguments.create import add_create_arguments # Parse arguments + # Custom formatter to prevent line wrapping in epilog + class NoWrapFormatter(argparse.RawDescriptionHelpFormatter): + def _split_lines(self, text, width): + return text.splitlines() + parser = argparse.ArgumentParser( prog='skill-seekers create', description='Create skill from any source (auto-detects type)', - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=""" + formatter_class=NoWrapFormatter, + epilog=textwrap.dedent("""\ Examples: - Web documentation: - skill-seekers create https://docs.react.dev/ - skill-seekers create docs.vue.org --preset quick + Web: skill-seekers create https://docs.react.dev/ + GitHub: skill-seekers create facebook/react -p standard + Local: skill-seekers create ./my-project -p comprehensive + PDF: skill-seekers create tutorial.pdf --ocr + Config: skill-seekers create configs/react.json - GitHub repository: - skill-seekers create facebook/react - skill-seekers create github.com/vuejs/vue --preset standard +Source Auto-Detection: + • URLs/domains → web scraping + • owner/repo → GitHub analysis + • ./path → local codebase + • file.pdf → PDF extraction + • file.json → multi-source config - Local codebase: - skill-seekers create ./my-project - skill-seekers create /path/to/repo --preset comprehensive +Progressive Help (13 → 120+ flags): + --help-web Web scraping options + --help-github GitHub repository options + --help-local Local codebase analysis + --help-pdf PDF extraction options + --help-advanced Rare/advanced options + --help-all All options + compatibility - PDF file: - skill-seekers create tutorial.pdf --ocr - skill-seekers create guide.pdf --pages 1-10 - - Config file (multi-source): - skill-seekers create configs/react.json - -Source Detection: - Source type is auto-detected from input: - • URLs (https://... or domain.com) → web scraping - • owner/repo or github.com/... → GitHub analysis - • ./path or /absolute/path → local codebase - • file.pdf → PDF extraction - • file.json → config file (multi-source) - -Need More Options? - The default help shows universal arguments only (13 flags). - For source-specific options, use: - --help-web Web scraping options (max-pages, rate-limit, workers, etc.) - --help-github GitHub options (token, max-issues, no-changelog, etc.) - --help-local Local codebase options (languages, patterns, skip-*, etc.) - --help-pdf PDF extraction options (ocr, pages, etc.) - --help-advanced Advanced/rare options (no-rate-limit, interactive-*, etc.) - --help-all All 120+ options with compatibility matrix +Presets (NEW: Use -p shortcut): + -p quick Fast (1-2 min, basic features) + -p standard Balanced (5-10 min, recommended) + -p comprehensive Full (20-60 min, all features) Common Workflows: - Quick exploration (1-2 min): - skill-seekers create --preset quick - - Production skill (5-10 min): - skill-seekers create --preset standard --enhance-level 2 - - Comprehensive analysis (20-60 min): - skill-seekers create --preset comprehensive --enhance-level 3 - - RAG pipeline ready: - skill-seekers create --chunk-for-rag --chunk-size 512 - """ + skill-seekers create -p quick + skill-seekers create -p standard --enhance-level 2 + skill-seekers create --chunk-for-rag + """) ) # Add arguments in default mode (universal only) diff --git a/src/skill_seekers/cli/parsers/create_parser.py b/src/skill_seekers/cli/parsers/create_parser.py index 4e54ea6..1f0244c 100644 --- a/src/skill_seekers/cli/parsers/create_parser.py +++ b/src/skill_seekers/cli/parsers/create_parser.py @@ -9,6 +9,7 @@ Implements progressive disclosure: Follows existing SubcommandParser pattern for consistency. """ +import argparse from .base import SubcommandParser from skill_seekers.cli.arguments.create import add_create_arguments @@ -26,29 +27,22 @@ class CreateParser(SubcommandParser): @property def description(self) -> str: - return """Create skill from web docs, GitHub repos, local code, PDFs, or config files. + return """Auto-detects source type and creates skill. -Source type is auto-detected from the input: - - Web: https://docs.react.dev/ or docs.react.dev - - GitHub: facebook/react or github.com/facebook/react - - Local: ./my-project or /path/to/repo - - PDF: tutorial.pdf - - Config: configs/react.json +Quick Examples: + skill-seekers create https://docs.react.dev/ -p quick + skill-seekers create facebook/react -p standard + skill-seekers create ./my-project -p comprehensive -Examples: - skill-seekers create https://docs.react.dev/ --preset quick - skill-seekers create facebook/react --preset standard - skill-seekers create ./my-project --preset comprehensive - skill-seekers create tutorial.pdf --ocr - skill-seekers create configs/react.json +Source Types (auto-detected): + URLs → web docs | owner/repo → GitHub | ./path → local code + file.pdf → PDF | file.json → config (multi-source) -For source-specific options, use: - --help-web Show web scraping options - --help-github Show GitHub repository options - --help-local Show local codebase options - --help-pdf Show PDF extraction options - --help-advanced Show advanced/rare options - --help-all Show all 120+ options +Progressive Help (NEW -p shortcut): + Default help shows 13 flags. For more: --help-web, --help-github, + --help-local, --help-pdf, --help-advanced, --help-all (120+ flags) + +Presets: -p quick (1-2min) | -p standard (5-10min) | -p comprehensive (20-60min) """ def add_arguments(self, parser): @@ -101,3 +95,26 @@ For source-specific options, use: help='Show all available options (120+ flags)', dest='_help_all' ) + + def register(self, subparsers): + """Register this parser with custom formatter to prevent text wrapping. + + Args: + subparsers: Subparsers object from main parser + + Returns: + Configured ArgumentParser for this subcommand + """ + # Custom formatter that preserves line breaks + class NoWrapFormatter(argparse.RawDescriptionHelpFormatter): + def _split_lines(self, text, width): + return text.splitlines() + + parser = subparsers.add_parser( + self.name, + help=self.help, + description=self.description, + formatter_class=NoWrapFormatter + ) + self.add_arguments(parser) + return parser