feat(v2.7.0): Smart Rate Limit Management & Multi-Token Configuration

Major Features:
- Multi-profile GitHub token system with secure storage
- Smart rate limit handler with 4 strategies (prompt/wait/switch/fail)
- Interactive configuration wizard with browser integration
- Configurable timeout (default 30 min) per profile
- Automatic profile switching on rate limits
- Live countdown timers with real-time progress
- Non-interactive mode for CI/CD (--non-interactive flag)
- Progress tracking and resume capability (skeleton)
- Comprehensive test suite (16 tests, all passing)

Solves:
- Indefinite waiting on GitHub rate limits
- Confusing GitHub token setup

Files Added:
- src/skill_seekers/cli/config_manager.py (~490 lines)
- src/skill_seekers/cli/config_command.py (~400 lines)
- src/skill_seekers/cli/rate_limit_handler.py (~450 lines)
- src/skill_seekers/cli/resume_command.py (~150 lines)
- tests/test_rate_limit_handler.py (16 tests)

Files Modified:
- src/skill_seekers/cli/github_fetcher.py (rate limit integration)
- src/skill_seekers/cli/github_scraper.py (--non-interactive, --profile flags)
- src/skill_seekers/cli/main.py (config, resume subcommands)
- pyproject.toml (version 2.7.0)
- CHANGELOG.md, README.md, CLAUDE.md (documentation)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
yusyus
2026-01-17 18:38:31 +03:00
parent 52ca93f22b
commit c89f059712
15 changed files with 2891 additions and 33 deletions

View File

@@ -1303,6 +1303,10 @@ Examples:
help='Enhance SKILL.md using Claude Code (no API key needed)')
parser.add_argument('--api-key', type=str,
help='Anthropic API key for --enhance (or set ANTHROPIC_API_KEY)')
parser.add_argument('--non-interactive', action='store_true',
help='Non-interactive mode for CI/CD (fail fast on rate limits)')
parser.add_argument('--profile', type=str,
help='GitHub profile name to use from config')
args = parser.parse_args()
@@ -1310,6 +1314,11 @@ Examples:
if args.config:
with open(args.config, 'r', encoding='utf-8') as f:
config = json.load(f)
# Override with CLI args if provided
if args.non_interactive:
config['interactive'] = False
if args.profile:
config['github_profile'] = args.profile
elif args.repo:
config = {
'repo': args.repo,
@@ -1319,7 +1328,9 @@ Examples:
'include_issues': not args.no_issues,
'include_changelog': not args.no_changelog,
'include_releases': not args.no_releases,
'max_issues': args.max_issues
'max_issues': args.max_issues,
'interactive': not args.non_interactive,
'github_profile': args.profile
}
else:
parser.error('Either --repo or --config is required')