PROBLEM:
- Config extractor crashed on JSON files with arrays at root
- Error: "'list' object has no attribute 'items'"
- Example: save.json with [{"name": "item1"}, {"name": "item2"}]
- Only handled dict roots, not list roots
SOLUTION:
- Added type checking in _parse_json() and _parse_yaml()
- Handle three cases:
1. Dict at root: extract normally (existing behavior)
2. List at root: iterate and extract from each dict item
3. Primitive at root: skip with debug log
- List items are prefixed with [index] in nested path
CHANGES:
- config_extractor.py _parse_json(): Added isinstance checks
- config_extractor.py _parse_yaml(): Added list handling
EXAMPLE:
Before: WARNING: Error parsing save.json: 'list' object has no attribute 'items'
After: Extracts settings with paths like "[0].name", "[1].value"
IMPACT:
- No more crashes on valid JSON/YAML arrays
- Better coverage of config file variations
- Handles game save files, API responses, data arrays
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
PROBLEM:
- Progress indicator only showed every 5 batches or at completion
- When enhancing 1-4 patterns, no progress was visible
- User saw "Enhancing 1 patterns..." → "Enhanced 1 patterns" with no progress
SOLUTION:
- Modified progress condition to always show for small jobs (total < 10)
- Original: `if completed % 5 == 0 or completed == total`
- Updated: `if total < 10 or completed % 5 == 0 or completed == total`
IMPACT:
- Now shows "Progress: 1/3 batches completed" for small jobs
- Large jobs (10+) still show every 5th batch to avoid spam
- Applied to both _enhance_patterns_parallel and _enhance_examples_parallel
FILES:
- ai_enhancer.py line 301-302 (patterns)
- ai_enhancer.py line 439-440 (test examples)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
**Problem:**
Framework detection only checked analyzed source files, missing game
engine marker files like project.godot, .unity, .uproject (config files).
**Root Cause:**
_detect_frameworks() only scanned files_analysis list which contains
source code (.cs, .py, .js) but not config files.
**Solution:**
- Now scans actual directory structure using directory.iterdir()
- Checks BOTH analyzed files AND directory contents
- Game engines checked FIRST with priority (prevents false positives)
- Returns early if game engine found (avoids Unity→ASP.NET confusion)
**Test Results:**
Before: frameworks_detected: []
After: frameworks_detected: ["Godot"] ✅
Tested with: Cosmic Ideler (Godot 4.6 RC2 project)
- Correctly detects project.godot file
- No longer requires source code to have "godot" in paths
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Completes the implementation for Unity/Unreal/Godot game engine support
and adds missing "local" source type validation.
Changes:
- Add "local" to VALID_SOURCE_TYPES in config_validator.py
- Add _validate_local_source() method with full validation
- Add Unity/Unreal/Godot to FRAMEWORK_MARKERS for priority detection
- Add game engine directory exclusions to all 3 scrapers:
* Unity: Library/, Temp/, Logs/, UserSettings/, etc.
* Unreal: Intermediate/, Saved/, DerivedDataCache/
* Godot: .godot/, .import/
- Prevents scanning massive build cache directories (saves GBs + hours)
This completes all features mentioned in PR #278:
✅ Unity/Unreal/Godot framework detection with priority
✅ Pattern enhancement performance fix (grouped approach)
✅ Game engine directory exclusions
✅ Phase 5 SKILL.md AI enhancement
✅ Local source references copying
✅ "local" source type validation
✅ Config field name compatibility
✅ C# test example extraction
Tested:
- All unified config tests pass (18/18)
- All config validation tests pass (28/28)
- Ready for Unity project testing
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Scan ALL .md files in project (README, docs/, etc.)
- Smart categorization by folder/filename (overview, architecture, guides, etc.)
- Processing depth: surface=raw copy, deep=parse+summarize, full=AI-enhanced
- AI enhancement at level 2+ adds topic extraction and cross-references
- New "Project Documentation" section in SKILL.md with summaries
- Output to references/documentation/ organized by category
- Default ON, use --skip-docs to disable
- Add skip_docs parameter to MCP scrape_codebase_tool
- Add 15 new tests for markdown documentation features
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add enhance_level parameter (0-3) for granular AI control
- Add skip_* parameters for feature control (skip_patterns, skip_test_examples, etc.)
- Remove deprecated --build-* flags (features are now ON by default)
- Adjust timeout based on enhance_level (10min base, up to 60min for level 3)
- Update documentation with examples
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Levels:
- 0 (off): No AI enhancement (default)
- 1 (minimal): SKILL.md enhancement only (fast, high value)
- 2 (standard): SKILL.md + Architecture + Config enhancement
- 3 (full): Everything including patterns and test examples
--comprehensive and --enhance-level are INDEPENDENT:
- --comprehensive: Controls depth and features (full depth + all features)
- --enhance-level: Controls AI enhancement level
Usage examples:
skill-seekers analyze --directory . --enhance-level 1 # SKILL.md AI only
skill-seekers analyze --directory . --enhance # Same as level 1
skill-seekers analyze --directory . --comprehensive # All features, no AI
skill-seekers analyze --directory . --comprehensive --enhance-level 2 # All features + standard AI
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Increase default batch size from 5 to 20 patterns per CLI call
- Add parallel execution with 3 concurrent workers (configurable)
- Add ai_enhancement settings to config_manager:
- local_batch_size: patterns per Claude CLI call (default: 20)
- local_parallel_workers: concurrent CLI calls (default: 3)
- Expected speedup: 6-12x faster for large codebases
Config settings can be changed via:
skill-seekers config (coming soon) or editing ~/.config/skill-seekers/config.json
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When no ANTHROPIC_API_KEY is set, ai_enhancer.py now falls back to LOCAL
mode (Claude Code CLI) instead of disabling AI enhancement entirely.
Changes to AIEnhancer base class:
- AUTO mode now falls back to LOCAL instead of disabling
- Added _check_claude_cli() to verify Claude CLI is available
- Added _call_claude_local() method using Claude Code CLI
- Refactored _call_claude() to dispatch to API or LOCAL mode
- 2 minute timeout per LOCAL call (reasonable for batch processing)
This affects all AI enhancements:
- Design pattern enhancement (C3.1) → LOCAL fallback ✅
- Test example enhancement (C3.2) → LOCAL fallback ✅
- Architectural analysis (C3.7) → LOCAL fallback ✅
Before (bad UX):
ℹ️ AI enhancement disabled (no API key found)
After (good UX):
ℹ️ No API key found, using LOCAL mode (Claude Code CLI)
✅ AI enhancement enabled (using LOCAL mode - Claude Code CLI)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
UX improvement: When running `skill-seekers analyze --enhance` or
`skill-seekers analyze --comprehensive`, the SKILL.md is now automatically
enhanced as the final step. No need for a separate `skill-seekers enhance`
command.
Changes:
- After analyze_main() completes successfully, check if --enhance or
--comprehensive was used
- If SKILL.md exists, automatically run SkillEnhancer in headless mode
- Use force=True to skip all prompts (consistent with --comprehensive UX)
- 10 minute timeout for large codebases
- Graceful fallback with retry instructions if enhancement fails
Before (bad UX):
skill-seekers analyze --directory /path --enhance
# Then separately:
skill-seekers enhance output/codebase/
After (good UX):
skill-seekers analyze --directory /path --enhance
# Everything done in one command!
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The previous implementation had a design flaw - it ran `claude prompt_file`
and expected Claude to magically create a JSON file in a temp directory.
This never worked because Claude CLI is interactive and doesn't auto-save.
Changes:
- Use `--dangerously-skip-permissions` flag to bypass permission prompts
- Create a dedicated temp directory for each enhancement session
- Embed absolute output file path in the prompt so Claude knows where to write
- Run Claude from the temp directory as working_dir
- Improved prompt with explicit Write tool instruction
- Better error handling and logging (file not found, JSON parse errors)
- Show settings preview in prompt for better AI context
The LOCAL mode now follows the same pattern as enhance_skill_local.py
which works correctly.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Bug fixes:
- Fix KeyError in config_enhancer.py where "config_type" was expected but
config_extractor saves as "type". Now supports both field names for
backward compatibility.
- Fix settings "value_type" vs "type" mismatch in the same file.
New features:
- Add C# support for regex-based test example extraction
- Add language alias mapping (C# -> csharp, C++ -> cpp)
- Enhanced C# patterns for NUnit, xUnit, MSTest test frameworks
- Support for mock patterns (NSubstitute, Moq)
- Support for Zenject dependency injection patterns
- Support for setup/teardown method extraction
Tests:
- Add 2 new C# test extraction tests (NUnit tests, mock patterns)
- All 1257 tests pass (165 skipped)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update Chinese README (README.zh-CN.md) with new preset flags
- Update docs/features/*.md (PATTERN_DETECTION, HOW_TO_GUIDES, BOOTSTRAP_SKILL_TECHNICAL)
- Update scripts/bootstrap_skill.sh to use 'skill-seekers analyze'
- Update scripts/skill_header.md command examples
- Update tests/test_bootstrap_skill.py assertions
- Fix CHANGELOG.md historical entry with correct command name
All references to 'skill-seekers-codebase' updated to 'skill-seekers analyze'
except where needed for backward compatibility (pyproject.toml, E2E tests).
Related to Phase 1 implementation from previous commits.
Fixes 2 failing integration tests to match current validation behavior:
1. test_load_config_with_validation_errors:
- Legacy validator is intentionally lenient for backward compatibility
- Only validates presence of fields, not format
- Updated test to use config that's truly invalid (missing all type fields)
2. test_godot_config:
- godot.json uses unified format (sources array), not legacy format
- Old validate_config() expects legacy format with top-level base_url
- Updated to use ConfigValidator which supports both formats
Changes:
- Import ConfigValidator for unified format validation
- Fix test_load_config_with_validation_errors to trigger actual validation error
- Fix test_godot_config to use ConfigValidator instead of old validate_config
Test Results:
- Both previously failing tests now PASS ✅
- All 71 related tests PASS ✅
- No regressions introduced
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implements Phase 1 of the codebase analysis UX improvement plan, making the
command discoverable and adding intuitive preset flags while maintaining 100%
backward compatibility.
New Features:
- Add 'analyze' subcommand to main CLI (skill-seekers analyze)
- Add --quick preset: Fast analysis (1-2 min, basic features only)
- Add --comprehensive preset: Full analysis (20-60 min, all features + AI)
- Add --enhance flag: Simple AI enhancement with auto-detection
- Improve help text with timing estimates and mode descriptions
Files Modified:
- src/skill_seekers/cli/main.py: Add analyze subcommand (lines 15, 273-311, 542-589)
- src/skill_seekers/cli/codebase_scraper.py: Add preset logic and improve help text
- tests/test_analyze_command.py: NEW - 20 comprehensive tests
- tests/test_cli_paths.py: Fix version check (2.7.0 -> 2.7.2)
- tests/test_package_structure.py: Fix 4 version checks (2.7.0 -> 2.7.2)
- README.md: Update examples to use 'analyze' command
- CLAUDE.md: Update examples to use 'analyze' command
Test Results:
- 81 tests related to Phase 1: ALL PASSING ✅
- 20 new tests for analyze command: ALL PASSING ✅
- Zero regressions introduced
- 100% backward compatibility maintained
Backward Compatibility:
- Old 'skill-seekers-codebase' command still works
- All existing flags (--depth, --ai-mode, --skip-*) still functional
- No breaking changes
Usage Examples:
skill-seekers analyze --directory . --quick
skill-seekers analyze --directory . --comprehensive
skill-seekers analyze --directory . --enhance
Fixes#262 (codebase UX issues)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updated documentation to clarify the three config file locations:
1. README.md:
- Added "Where to Place Custom Configs" section
- Explains all three options: user dir, current dir, absolute path
- Shows config resolution order
2. BULLETPROOF_QUICKSTART.md:
- Added "Where to Save Custom Configs" section
- Practical examples for beginners
- Clarifies when to use each option
3. TROUBLESHOOTING.md:
- Enhanced "Config File Not Found" section
- Shows all search locations
- Provides 5 clear solutions
These docs address the confusion reported in #262 about where to
place custom config files. Users now have clear guidance on using
the new ~/.config/skill-seekers/configs/ directory.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Three critical UX improvements for custom config handling:
1. User config directory support:
- Added ~/.config/skill-seekers/configs/ to search path
- Users can now place custom configs in their home directory
- Path resolution order: exact path → ./configs/ → user config dir → API
2. Better error messages:
- Show all searched absolute paths when config not found
- Added get_last_searched_paths() function to track locations
- Clear guidance on where to place custom configs
3. Auto-create config.json:
- ConfigManager now creates config.json on first initialization
- Creates configs/ subdirectory for user custom configs
- Display shows custom configs directory path
Fixes reported by @melamers in issue #262 where:
- Config path shown by `skill-seekers config` didn't exist
- Unclear where to save custom configs
- Error messages didn't show exact paths searched
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixes#264
Users reported that preset configs (react.json, godot.json, etc.) were not
found after installing via pip/uv, causing immediate failure on first use.
Solution: Instead of bundling configs in the package, the CLI now automatically
fetches missing configs from the SkillSeekersWeb.com API.
Changes:
- Created config_fetcher.py with smart config resolution:
1. Check local path (backward compatible)
2. Check with configs/ prefix
3. Auto-fetch from SkillSeekersWeb.com API (new!)
- Updated doc_scraper.py to use ConfigValidator (supports unified configs)
- Added 15 comprehensive tests for auto-fetch functionality
User Experience:
- Zero configuration needed - presets work immediately after install
- Better error messages showing available configs from API
- Downloaded configs are cached locally for future use
- Fully backward compatible with existing local configs
Testing:
- 15 new unit tests (all passing)
- 2 integration tests with real API
- Full test suite: 1387 tests passing
- No breaking changes
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
## Critical Bugs Fixed
### 1. UnboundLocalError in AI Enhancement Modules (BLOCKING)
**Issue**: Duplicate `import os` statements inside conditional blocks caused
UnboundLocalError when accessing os.environ before the import was reached.
**Files Fixed**:
- src/skill_seekers/cli/guide_enhancer.py (lines 92, 112)
- src/skill_seekers/cli/ai_enhancer.py (line 77)
- src/skill_seekers/cli/config_enhancer.py (line 82)
**Root Cause**: `os` was already imported at file top, but re-imported inside
conditional blocks, creating a local variable scope issue.
**Solution**: Removed duplicate import statements - os is already available
from the top-level import.
**Impact**: Fixed 30 failing guide_enhancer tests
### 2. PDF Scraper Test Expectations (BREAKING CHANGE)
**Issue**: Tests expected old keyword-based categorization behavior, but PR
introduced new single-file strategy for single PDF sources.
**Files Fixed**:
- tests/test_pdf_scraper.py (5 tests updated)
**Tests Updated**:
1. test_categorize_by_keywords
2. test_build_skill_creates_reference_files
3. test_code_blocks_included_in_references
4. test_high_quality_code_preferred
5. test_image_references_in_markdown
**Solution**: Updated test expectations to match new single-file strategy
behavior (single PDF → single category named after PDF basename).
**Impact**: Fixed 5 failing PDF scraper tests
## Test Results
**Before Fixes**: 35 tests failing
**After Fixes**: 130 tests passing, 5 skipped ✅
### Tested Modules:
- ✅ PDF scraper (18 tests)
- ✅ Guide enhancer (30 tests)
- ✅ All adaptors (82 tests)
## Verification
```bash
pytest tests/test_pdf_scraper.py tests/test_guide_enhancer.py tests/test_adaptors/ -v
# Result: 130 passed, 5 skipped in 1.11s
```
## Notes
The original PR features (GLM-4.7 support + PDF scraper improvements) are
excellent and working correctly. These fixes only address the import scoping
bug introduced during implementation and update tests for the new behavior.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Merging with admin override due to known issues:
✅ **What Works**:
- GLM-4.7 Claude-compatible API support (correctly implemented)
- PDF scraper improvements (content truncation fixed, page traceability added)
- Documentation updates comprehensive
⚠️ **Known Issues (will be fixed in next commit)**:
1. Import bugs in 3 files causing UnboundLocalError (30 tests failing)
2. PDF scraper test expectations need updating for new behavior (5 tests failing)
3. test_godot_config failure (pre-existing, not caused by this PR - 1 test failing)
**Action Plan**:
Fixes for issues #1 and #2 are ready and will be committed immediately after merge.
Issue #3 requires separate investigation as it's a pre-existing problem.
Total: 36 failing tests, 35 will be fixed in next commit.
The test config was missing CSS selectors, causing the scraper to fail
with "No content" errors on Tailwind CSS documentation.
Changes:
- Added selectors section with proper CSS selectors for Tailwind docs
- Added Windows PowerShell alternative since cat/EOF doesn't work there
- Includes main_content, title, and code_blocks selectors
This fixes the "No content" error reported in issue #261.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixes#261
The guide was missing the critical `pip install -e .` step, which caused
the skill-seekers command to not be found on Windows (and all platforms).
Changes:
- Updated Step 4 to use `pip install -e .` instead of manually installing deps
- Added explanation of what the command does
- Updated troubleshooting section for "command not found" errors
- Added fallback for pip command issues
This ensures the package is properly installed and console scripts are
registered, making the skill-seekers command available in PATH.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add Twitter/X follow badge to both READMEs (English and Chinese)
- Add GitHub stars badge for social proof
- Add Author link to pyproject.toml pointing to X profile
- Set repository homepage URL to skillseekersweb.com
These changes improve discoverability and community engagement.
This patch release fixes the broken Chinese language selector link
on PyPI by using absolute GitHub URLs instead of relative paths.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Changed relative links (README.zh-CN.md) to absolute GitHub URLs
so they work correctly on PyPI, GitHub, and any other platform
that displays the README.
This fixes the broken Chinese link in the language selector.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This patch release focuses on internationalization and making Skill Seekers
accessible to the Chinese developer community.
Key updates:
- Complete Chinese (简体中文) README translation
- PyPI metadata updated with i18n support
- Natural Language classifiers added
- Community engagement issue created
See CHANGELOG.md for complete release notes.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add Chinese (简体中文) mention in package description
- Add i18n, chinese, international keywords for better discoverability
- Add Natural Language classifiers for English and Chinese (Simplified)
- Add direct link to Chinese README in project URLs
This makes the Chinese translation more discoverable on PyPI and
appeals to the massive Chinese developer market.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add comprehensive Chinese translation (README.zh-CN.md)
- Add language selector badges to both English and Chinese READMEs
- Mark translation as AI-generated with disclaimer
- Create GitHub issue #260 for community review and improvements
The Chinese translation makes Skill Seekers accessible to the massive
Chinese developer community. It's marked as machine-translated to set
expectations and invite community contributions for improvement.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This hotfix resolves 4 critical bugs reported by users:
Issue #258: install command fails with unified_scraper
- Added --fresh and --dry-run flags to unified_scraper.py
- Updated main.py to pass both flags to unified scraper
- Fixed "unrecognized arguments" error
Issue #259 (Original): scrape command doesn't accept positional URL and --max-pages
- Added positional URL argument to scrape command
- Added --max-pages flag with safety warnings (>1000 pages, <10 pages)
- Updated doc_scraper.py and main.py argument parsers
Issue #259 (Comment A): Version shows 2.7.0 instead of actual version
- Fixed hardcoded version in main.py
- Now reads version dynamically from __init__.py
Issue #259 (Comment B): PDF command shows empty "Error: " message
- Improved exception handler in main.py to show exception type if message is empty
- Added proper error handling in pdf_scraper.py with context-specific messages
- Added traceback support in verbose mode
All fixes tested and verified with exact commands from issue reports.
Resolves: #258, #259
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
CRITICAL BUG FIX - Resolves 404 errors when fetching configs from API
Root Cause:
The code was constructing download URLs manually:
download_url = f"{API_BASE_URL}/api/download/{config_name}.json"
This fails because the API provides download_url in the response, which
may differ from the constructed path (e.g., CDN URLs, version-specific paths).
Solution:
Changed both MCP server implementations to use download_url from API:
download_url = config_info.get("download_url")
Added validation check for missing download_url field.
Files Modified:
- src/skill_seekers/mcp/tools/source_tools.py (FastMCP server, line 285-297)
- src/skill_seekers/mcp/server_legacy.py (Legacy server, line 1483-1494)
Bug Report:
User reported: skill-seekers install --config godot --unlimited
- API check: /api/configs/godot → 200 OK ✅
- Download: /api/download/godot.json → 404 Not Found ❌
After Fix:
- Uses download_url from API response → Works correctly ✅
Testing:
✅ All 15 source tools tests pass (test_mcp_fastmcp.py::TestSourceTools)
✅ All 8 fetch_config tests pass
✅ test_fetch_config_download_api: PASSED
✅ test_fetch_config_from_source: PASSED
Impact:
- Fixes config downloads from official API (skillseekersweb.com)
- Fixes config downloads from private Git repositories
- Prevents all future 404 errors from URL construction mismatch
- No breaking changes - fully backward compatible
Related Issue: Bug reported by user when testing Godot skill
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>