fix: smart enhancement dispatcher — Gemini/API mode + root/Docker detection
Fixes issues #289 and #286 (agent switching and Docker/root failures). enhance_command.py (new smart dispatcher): - Routes skill-seekers enhance to API mode (Gemini/OpenAI/Claude API) when an API key is available, or LOCAL mode (Claude Code CLI) otherwise - Decision priority: --target flag > config default_agent > auto-detect from env vars (ANTHROPIC_API_KEY → claude, GOOGLE_API_KEY → gemini, OPENAI_API_KEY → openai) > LOCAL fallback - Blocks LOCAL mode when running as root (Docker/VPS) with clear error message + API mode instructions - Supports --dry-run, --target, --api-key as first-class flags arguments/enhance.py: - Added --target, --api-key, --dry-run, --interactive-enhancement to ENHANCE_ARGUMENTS (shared by unified CLI parser and standalone entry point) enhance_skill_local.py: - Error output no longer truncated at 200 chars (shows up to 20 lines) - Detects root/permission errors in stderr and prints actionable hint config_manager.py: - Added default_agent field to DEFAULT_CONFIG ai_enhancement section - Added get_default_agent() and set_default_agent() methods main.py: - enhance command routed to enhance_command (was enhance_skill_local) - _handle_analyze_command uses smart dispatcher for post-analysis enhancement pyproject.toml: - skill-seekers-enhance entry point updated to enhance_command:main Tests: 1977 passed, 0 failed (28 new tests in test_enhance_command.py) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -14,7 +14,7 @@ Commands:
|
||||
pdf Extract from PDF file
|
||||
unified Multi-source scraping (docs + GitHub + PDF)
|
||||
analyze Analyze local codebase and extract code knowledge
|
||||
enhance AI-powered enhancement (local, no API key)
|
||||
enhance AI-powered enhancement (auto: API or LOCAL mode)
|
||||
enhance-status Check enhancement status (for background/daemon modes)
|
||||
package Package skill into .zip file
|
||||
upload Upload skill to Claude
|
||||
@@ -48,7 +48,7 @@ COMMAND_MODULES = {
|
||||
"github": "skill_seekers.cli.github_scraper",
|
||||
"pdf": "skill_seekers.cli.pdf_scraper",
|
||||
"unified": "skill_seekers.cli.unified_scraper",
|
||||
"enhance": "skill_seekers.cli.enhance_skill_local",
|
||||
"enhance": "skill_seekers.cli.enhance_command",
|
||||
"enhance-status": "skill_seekers.cli.enhance_status",
|
||||
"package": "skill_seekers.cli.package_skill",
|
||||
"upload": "skill_seekers.cli.upload_skill",
|
||||
@@ -320,10 +320,39 @@ def _handle_analyze_command(args: argparse.Namespace) -> int:
|
||||
print("=" * 60 + "\n")
|
||||
|
||||
try:
|
||||
from skill_seekers.cli.enhance_skill_local import LocalSkillEnhancer
|
||||
from skill_seekers.cli.enhance_command import (
|
||||
_is_root,
|
||||
_pick_mode,
|
||||
_run_api_mode,
|
||||
_run_local_mode,
|
||||
)
|
||||
import argparse as _ap
|
||||
|
||||
enhancer = LocalSkillEnhancer(str(skill_dir), force=True)
|
||||
success = enhancer.run(headless=True, timeout=600)
|
||||
_fake_args = _ap.Namespace(
|
||||
skill_directory=str(skill_dir),
|
||||
target=None,
|
||||
api_key=None,
|
||||
dry_run=False,
|
||||
agent=None,
|
||||
agent_cmd=None,
|
||||
interactive_enhancement=False,
|
||||
background=False,
|
||||
daemon=False,
|
||||
no_force=False,
|
||||
timeout=600,
|
||||
)
|
||||
_mode, _target = _pick_mode(_fake_args)
|
||||
|
||||
if _mode == "api":
|
||||
print(f"\n🤖 Enhancement mode: API ({_target})")
|
||||
success = _run_api_mode(_fake_args, _target) == 0
|
||||
elif _is_root():
|
||||
print("\n⚠️ Skipping SKILL.md enhancement: running as root")
|
||||
print(" Set ANTHROPIC_API_KEY / GOOGLE_API_KEY to enable API mode")
|
||||
success = False
|
||||
else:
|
||||
print("\n🤖 Enhancement mode: LOCAL (Claude Code CLI)")
|
||||
success = _run_local_mode(_fake_args) == 0
|
||||
|
||||
if success:
|
||||
print("\n✅ SKILL.md enhancement complete!")
|
||||
|
||||
Reference in New Issue
Block a user