Skip to content

Commit 6e68531

Browse files
merge: Sync latest main changes into development (Tasks 1.3, 2.1, 2.2)
2 parents e2b411d + cf77f9e commit 6e68531

File tree

7 files changed

+90
-37
lines changed

7 files changed

+90
-37
lines changed

CLAUDE.md

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
1515
- **✅ CI/CD Fixed**: All 5 test matrix jobs passing (Ubuntu + macOS, Python 3.10-3.12)
1616
- **📚 Documentation Complete**: README, CHANGELOG, FUTURE_RELEASES.md all updated
1717
- **🚀 Unified CLI**: Single `skill-seekers` command with Git-style subcommands
18-
- **🧪 Test Coverage**: 379 tests passing, 39% coverage
18+
- **🧪 Test Coverage**: 391 tests passing, 39% coverage
1919
- **🌐 Community**: GitHub Discussion, Release notes, announcements published
2020

2121
**🚀 Unified Multi-Source Scraping (v2.0.0)**
2222
- **NEW**: Combine documentation + GitHub + PDF in one skill
2323
- **NEW**: Automatic conflict detection between docs and code
2424
- **NEW**: Rule-based and AI-powered merging
2525
- **NEW**: 5 example unified configs (React, Django, FastAPI, Godot, FastAPI-test)
26-
- **Status**: ⚠️ 12 unified tests need fixes (core functionality stable)
26+
- **Status**: ✅ All 22 unified tests passing (18 core + 4 MCP integration)
2727

2828
**✅ Community Response (H1 Group):**
2929
- **Issue #8 Fixed** - Added BULLETPROOF_QUICKSTART.md and TROUBLESHOOTING.md for beginners
@@ -40,16 +40,17 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
4040
- 📝 Multi-source configs: django_unified, fastapi_unified, fastapi_unified_test, godot_unified, react_unified
4141
- 📝 Test/Example configs: godot_github, react_github, python-tutorial-test, example_pdf, test-manual
4242

43-
**📋 Next Up (Post-PyPI v2.0.0):**
44-
- **✅ DONE**: PyPI publication complete
43+
**📋 Next Up (Post-v2.1.0):**
44+
- **✅ DONE**: PyPI publication complete (v2.0.0)
4545
- **✅ DONE**: CI/CD fixed - all checks passing
4646
- **✅ DONE**: Documentation updated (README, CHANGELOG, FUTURE_RELEASES.md)
47-
- **Priority 1**: Fix 12 failing unified tests in tests/test_unified.py
48-
- ConfigValidator expecting dict instead of file path
49-
- ConflictDetector expecting dict pages, not list
47+
- **✅ DONE**: Quality Assurance + Race Condition Fixes (v2.1.0)
48+
- **✅ DONE**: All critical bugs fixed (Issues #190, #192, #193)
49+
- **✅ DONE**: Test suite stabilized (391 tests passing)
50+
- **✅ DONE**: Unified tests fixed (all 22 passing)
51+
- **Priority 1**: Review and merge open PRs (#195, #196, #197, #198)
5052
- **Priority 2**: Task H1.3 - Create example project folder
5153
- **Priority 3**: Task A3.1 - GitHub Pages site (skillseekersweb.com)
52-
- **Priority 4**: Task J1.1 - Install MCP package for testing
5354

5455
**📊 Roadmap Progress:**
5556
- 134 tasks organized into 22 feature groups
@@ -325,12 +326,13 @@ Skill_Seekers/
325326
│ │ └── conflict_detector.py # Conflict detection
326327
│ └── mcp/ # MCP server integration
327328
│ └── server.py
328-
├── tests/ # Test suite (379 tests passing)
329+
├── tests/ # Test suite (391 tests passing)
329330
│ ├── test_scraper_features.py
330331
│ ├── test_config_validation.py
331332
│ ├── test_integration.py
332333
│ ├── test_mcp_server.py
333-
│ ├── test_unified.py # (12 tests need fixes)
334+
│ ├── test_unified.py # Unified scraping tests (18 tests)
335+
│ ├── test_unified_mcp_integration.py # (4 tests)
334336
│ └── ...
335337
├── configs/ # Preset configurations (24 configs)
336338
│ ├── godot.json
@@ -743,11 +745,11 @@ The correct command uses the local `cli/package_skill.py` in the repository root
743745
- ✅ `claude-code.json` - Claude Code documentation **NEW!**
744746
745747
### Unified Multi-Source Configs (5 configs - **NEW v2.0!**)
746-
- ⚠️ `react_unified.json` - React (docs + GitHub + code analysis)
747-
- ⚠️ `django_unified.json` - Django (docs + GitHub + code analysis)
748-
- ⚠️ `fastapi_unified.json` - FastAPI (docs + GitHub + code analysis)
749-
- ⚠️ `fastapi_unified_test.json` - FastAPI test config
750-
- ⚠️ `godot_unified.json` - Godot (docs + GitHub + code analysis)
748+
- `react_unified.json` - React (docs + GitHub + code analysis)
749+
- `django_unified.json` - Django (docs + GitHub + code analysis)
750+
- `fastapi_unified.json` - FastAPI (docs + GitHub + code analysis)
751+
- `fastapi_unified_test.json` - FastAPI test config
752+
- `godot_unified.json` - Godot (docs + GitHub + code analysis)
751753
752754
### Test/Example Configs (5 configs)
753755
- 📝 `godot_github.json` - GitHub-only scraping example
@@ -756,8 +758,8 @@ The correct command uses the local `cli/package_skill.py` in the repository root
756758
- 📝 `example_pdf.json` - PDF extraction example
757759
- 📝 `test-manual.json` - Manual testing config
758760
759-
**Note:** ⚠️ = Unified configs have 12 failing tests that need fixing
760-
**Last verified:** November 11, 2025 (v2.0.0 PyPI release)
761+
**Note:** All configs verified and working! Unified configs fully tested with 22 passing tests.
762+
**Last verified:** November 29, 2025 (Post-v2.1.0 bug fixes)
761763
762764
## Additional Documentation
763765
@@ -789,7 +791,7 @@ The correct command uses the local `cli/package_skill.py` in the repository root
789791
- ✅ **Modern Python Packaging**: pyproject.toml, src/ layout, entry points
790792
- ✅ **Unified CLI**: Single `skill-seekers` command with Git-style subcommands
791793
- ✅ **CI/CD Working**: All 5 test matrix jobs passing (Ubuntu + macOS, Python 3.10-3.12)
792-
- ✅ **Test Coverage**: 379 tests passing, 39% coverage
794+
- ✅ **Test Coverage**: 391 tests passing, 39% coverage
793795
- ✅ **Documentation**: Complete user and technical documentation
794796
795797
**Architecture:**
@@ -801,7 +803,7 @@ The correct command uses the local `cli/package_skill.py` in the repository root
801803
802804
**Development Workflow:**
803805
1. **Install**: `pip install -e .` (editable mode for development)
804-
2. **Run tests**: `pytest tests/` (379 tests)
806+
2. **Run tests**: `pytest tests/` (391 tests)
805807
3. **Build package**: `uv build` or `python -m build`
806808
4. **Publish**: `uv publish` (PyPI)
807809

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ Skill Seeker is an automated tool that transforms documentation websites, GitHub
8686
-**Caching System** - Scrape once, rebuild instantly
8787

8888
### ✅ Quality Assurance
89-
-**Fully Tested** - 379 tests with comprehensive coverage
89+
-**Fully Tested** - 391 tests with comprehensive coverage
9090

9191
---
9292

docs/CLAUDE.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,40 @@ print(soup.select_one('main'))
326326
print(soup.select_one('div[role="main"]'))
327327
```
328328

329+
## Running Tests
330+
331+
**IMPORTANT: You must install the package before running tests**
332+
333+
```bash
334+
# 1. Install package in editable mode (one-time setup)
335+
pip install -e .
336+
337+
# 2. Run all tests
338+
pytest
339+
340+
# 3. Run specific test files
341+
pytest tests/test_config_validation.py
342+
pytest tests/test_github_scraper.py
343+
344+
# 4. Run with verbose output
345+
pytest -v
346+
347+
# 5. Run with coverage report
348+
pytest --cov=src/skill_seekers --cov-report=html
349+
```
350+
351+
**Why install first?**
352+
- Tests import from `skill_seekers.cli` which requires the package to be installed
353+
- Modern Python packaging best practice (PEP 517/518)
354+
- CI/CD automatically installs with `pip install -e .`
355+
- conftest.py will show helpful error if package not installed
356+
357+
**Test Coverage:**
358+
- 391+ tests passing
359+
- 39% code coverage
360+
- All core features tested
361+
- CI/CD tests on Ubuntu + macOS with Python 3.10-3.12
362+
329363
## Troubleshooting
330364

331365
**No content extracted**: Check `main_content` selector. Common values: `article`, `main`, `div[role="main"]`, `div.content`

src/skill_seekers/cli/github_scraper.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@
3131
print("Error: PyGithub not installed. Run: pip install PyGithub")
3232
sys.exit(1)
3333

34+
# Configure logging FIRST (before using logger)
35+
logging.basicConfig(
36+
level=logging.INFO,
37+
format='%(asctime)s - %(levelname)s - %(message)s'
38+
)
39+
logger = logging.getLogger(__name__)
40+
3441
# Import code analyzer for deep code analysis
3542
try:
3643
from .code_analyzer import CodeAnalyzer
@@ -39,13 +46,6 @@
3946
CODE_ANALYZER_AVAILABLE = False
4047
logger.warning("Code analyzer not available - deep analysis disabled")
4148

42-
# Configure logging
43-
logging.basicConfig(
44-
level=logging.INFO,
45-
format='%(asctime)s - %(levelname)s - %(message)s'
46-
)
47-
logger = logging.getLogger(__name__)
48-
4949

5050
class GitHubScraper:
5151
"""

tests/conftest.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,28 @@
22
Pytest configuration for tests.
33
44
Configures anyio to only use asyncio backend (not trio).
5+
Checks that the skill_seekers package is installed before running tests.
56
"""
67

8+
import sys
79
import pytest
810

911

12+
def pytest_configure(config):
13+
"""Check if package is installed before running tests."""
14+
try:
15+
import skill_seekers
16+
except ModuleNotFoundError:
17+
print("\n" + "=" * 70)
18+
print("ERROR: skill_seekers package not installed")
19+
print("=" * 70)
20+
print("\nPlease install the package in editable mode first:")
21+
print(" pip install -e .")
22+
print("\nOr activate your virtual environment if you already installed it.")
23+
print("=" * 70 + "\n")
24+
sys.exit(1)
25+
26+
1027
@pytest.fixture(scope="session")
1128
def anyio_backend():
1229
"""Override anyio backend to only use asyncio (not trio)."""

tests/test_constants.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,14 @@ class TestConstantsUsage(unittest.TestCase):
109109

110110
def test_doc_scraper_imports_constants(self):
111111
"""Test that doc_scraper imports and uses constants."""
112-
from cli import doc_scraper
112+
from skill_seekers.cli import doc_scraper
113113
# Check that doc_scraper can access the constants
114114
self.assertTrue(hasattr(doc_scraper, 'DEFAULT_RATE_LIMIT'))
115115
self.assertTrue(hasattr(doc_scraper, 'DEFAULT_MAX_PAGES'))
116116

117117
def test_estimate_pages_imports_constants(self):
118118
"""Test that estimate_pages imports and uses constants."""
119-
from cli import estimate_pages
119+
from skill_seekers.cli import estimate_pages
120120
# Verify function signature uses constants
121121
import inspect
122122
sig = inspect.signature(estimate_pages.estimate_pages)
@@ -125,7 +125,7 @@ def test_estimate_pages_imports_constants(self):
125125
def test_enhance_skill_imports_constants(self):
126126
"""Test that enhance_skill imports constants."""
127127
try:
128-
from cli import enhance_skill
128+
from skill_seekers.cli import enhance_skill
129129
# Check module loads without errors
130130
self.assertIsNotNone(enhance_skill)
131131
except (ImportError, SystemExit) as e:
@@ -135,7 +135,7 @@ def test_enhance_skill_imports_constants(self):
135135

136136
def test_enhance_skill_local_imports_constants(self):
137137
"""Test that enhance_skill_local imports constants."""
138-
from cli import enhance_skill_local
138+
from skill_seekers.cli import enhance_skill_local
139139
self.assertIsNotNone(enhance_skill_local)
140140

141141

@@ -144,7 +144,7 @@ class TestConstantsExports(unittest.TestCase):
144144

145145
def test_all_exports_exist(self):
146146
"""Test that all items in __all__ exist."""
147-
from cli import constants
147+
from skill_seekers.cli import constants
148148
self.assertTrue(hasattr(constants, '__all__'))
149149
for name in constants.__all__:
150150
self.assertTrue(
@@ -154,7 +154,7 @@ def test_all_exports_exist(self):
154154

155155
def test_all_exports_count(self):
156156
"""Test that __all__ has expected number of exports."""
157-
from cli import constants
157+
from skill_seekers.cli import constants
158158
# We defined 18 constants (added DEFAULT_ASYNC_MODE)
159159
self.assertEqual(len(constants.__all__), 18)
160160

tests/test_llms_txt_detector.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ def test_detect_llms_txt_variants():
66
"""Test detection of llms.txt file variants"""
77
detector = LlmsTxtDetector("https://hono.dev/docs")
88

9-
with patch('cli.llms_txt_detector.requests.head') as mock_head:
9+
with patch('skill_seekers.cli.llms_txt_detector.requests.head') as mock_head:
1010
mock_response = Mock()
1111
mock_response.status_code = 200
1212
mock_head.return_value = mock_response
@@ -22,7 +22,7 @@ def test_detect_no_llms_txt():
2222
"""Test detection when no llms.txt file exists"""
2323
detector = LlmsTxtDetector("https://example.com/docs")
2424

25-
with patch('cli.llms_txt_detector.requests.head') as mock_head:
25+
with patch('skill_seekers.cli.llms_txt_detector.requests.head') as mock_head:
2626
mock_response = Mock()
2727
mock_response.status_code = 404
2828
mock_head.return_value = mock_response
@@ -36,7 +36,7 @@ def test_url_parsing_with_complex_paths():
3636
"""Test URL parsing handles non-standard paths correctly"""
3737
detector = LlmsTxtDetector("https://example.com/docs/v2/guide")
3838

39-
with patch('cli.llms_txt_detector.requests.head') as mock_head:
39+
with patch('skill_seekers.cli.llms_txt_detector.requests.head') as mock_head:
4040
mock_response = Mock()
4141
mock_response.status_code = 200
4242
mock_head.return_value = mock_response
@@ -55,7 +55,7 @@ def test_detect_all_variants():
5555
"""Test detecting all llms.txt variants"""
5656
detector = LlmsTxtDetector("https://hono.dev/docs")
5757

58-
with patch('cli.llms_txt_detector.requests.head') as mock_head:
58+
with patch('skill_seekers.cli.llms_txt_detector.requests.head') as mock_head:
5959
# Mock responses for different variants
6060
def mock_response(url, **kwargs):
6161
response = Mock()

0 commit comments

Comments
 (0)