Skip to content

Commit c71befe

Browse files
Merge branch 'development' into main — release v3.7.0
2 parents 4cd5140 + a242d95 commit c71befe

244 files changed

Lines changed: 16260 additions & 8920 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Relates to #(issue number)
2525
- [ ] I have performed a self-review of my own code
2626
- [ ] I have commented my code, particularly in hard-to-understand areas
2727
- [ ] I have made corresponding changes to the documentation
28+
- [ ] Documentation updated (README, examples, AGENTS.md if CLI changed)
2829
- [ ] My changes generate no new warnings
2930
- [ ] I have added tests that prove my fix is effective or that my feature works
3031
- [ ] New and existing unit tests pass locally with my changes

.github/workflows/release.yml

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,10 @@ jobs:
3939
- name: Run tests
4040
timeout-minutes: 30
4141
run: |
42-
# Exclude slow MCP/e2e tests that can hang or run 20+ min each.
43-
# The tests.yml workflow (matrix CI) runs these in a separate job with
44-
# its own timeout; the release workflow only needs fast confidence that
45-
# the package is sound before publishing.
42+
pip install pytest-timeout
4643
python -m pytest tests/ -v \
47-
--ignore=tests/test_mcp_fastmcp.py \
48-
--ignore=tests/test_mcp_server.py \
49-
--ignore=tests/test_install_skill_e2e.py \
50-
--ignore=tests/test_bootstrap_skill_e2e.py
44+
-m "not slow and not integration and not e2e and not network and not serial and not mcp_only" \
45+
--timeout=120
5146
5247
- name: Extract version from tag
5348
id: get_version

.github/workflows/test-vector-dbs.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,19 @@ on:
99
paths:
1010
- 'src/skill_seekers/cli/adaptors/**'
1111
- 'src/skill_seekers/mcp/tools/vector_db_tools.py'
12-
- 'tests/test_*adaptor.py'
12+
- 'tests/test_*adaptor*.py'
1313
- 'tests/test_mcp_vector_dbs.py'
14+
- 'tests/test_docker_smoke.py'
15+
- 'tests/test_upload_integration.py'
1416
pull_request:
1517
branches: [ main, development ]
1618
paths:
1719
- 'src/skill_seekers/cli/adaptors/**'
1820
- 'src/skill_seekers/mcp/tools/vector_db_tools.py'
19-
- 'tests/test_*adaptor.py'
21+
- 'tests/test_*adaptor*.py'
2022
- 'tests/test_mcp_vector_dbs.py'
23+
- 'tests/test_docker_smoke.py'
24+
- 'tests/test_upload_integration.py'
2125
workflow_dispatch:
2226

2327
jobs:

.github/workflows/tests.yml

Lines changed: 78 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -12,92 +12,61 @@ jobs:
1212
runs-on: ubuntu-latest
1313
steps:
1414
- uses: actions/checkout@v4
15-
1615
- name: Set up Python 3.12
1716
uses: actions/setup-python@v5
1817
with:
1918
python-version: '3.12'
20-
2119
- name: Install dependencies
2220
run: |
2321
python -m pip install --upgrade pip
2422
pip install "ruff==0.15.8" mypy
2523
pip install -e .
26-
2724
- name: Run ruff linter
28-
run: |
29-
echo "Running ruff check..."
30-
ruff check src/ tests/ --output-format=github
31-
25+
run: ruff check src/ tests/ --output-format=github
3226
- name: Run ruff formatter check
33-
run: |
34-
echo "Checking code formatting..."
35-
ruff format --check src/ tests/
36-
27+
run: ruff format --check src/ tests/
3728
- name: Run mypy type checker
38-
run: |
39-
echo "Running mypy type checker..."
40-
mypy src/skill_seekers --show-error-codes --pretty
41-
continue-on-error: true # Don't fail CI on mypy errors initially
29+
run: mypy src/skill_seekers --show-error-codes --pretty
30+
continue-on-error: true
4231

43-
test:
32+
test-fast:
33+
name: Fast Unit Tests (parallel)
4434
runs-on: ${{ matrix.os }}
4535
strategy:
4636
fail-fast: false
4737
matrix:
4838
os: [ubuntu-latest, macos-latest]
4939
python-version: ['3.10', '3.11', '3.12']
5040
exclude:
51-
# Exclude some combinations to speed up CI
5241
- os: macos-latest
5342
python-version: '3.10'
54-
5543
steps:
5644
- uses: actions/checkout@v4
5745
with:
58-
submodules: recursive # Initialize api/configs_repo submodule
59-
46+
submodules: recursive
6047
- name: Set up Python ${{ matrix.python-version }}
6148
uses: actions/setup-python@v5
6249
with:
6350
python-version: ${{ matrix.python-version }}
64-
65-
- name: Install uv
66-
run: |
67-
curl -LsSf https://astral.sh/uv/install.sh | sh
68-
echo "$HOME/.local/bin" >> $GITHUB_PATH
69-
7051
- name: Cache pip packages
7152
uses: actions/cache@v4
7253
with:
7354
path: ~/.cache/pip
74-
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt', 'skill_seeker_mcp/requirements.txt') }}
55+
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
7556
restore-keys: |
7657
${{ runner.os }}-pip-
77-
7858
- name: Install dependencies
7959
run: |
8060
python -m pip install --upgrade pip
8161
pip install -r requirements.txt
82-
if [ -f skill_seeker_mcp/requirements.txt ]; then pip install -r skill_seeker_mcp/requirements.txt; fi
83-
# Install package in editable mode for tests (required for src/ layout)
62+
pip install pytest-xdist pytest-timeout
8463
pip install -e .
85-
86-
- name: Run CLI tests
87-
run: |
88-
python -m pytest tests/test_scraper_features.py -v
89-
python -m pytest tests/test_config_validation.py -v
90-
python -m pytest tests/test_integration.py -v
91-
92-
- name: Run MCP server tests
64+
- name: Run fast tests (xdist parallel)
9365
run: |
94-
python -m pytest tests/test_mcp_server.py -v
95-
96-
- name: Generate coverage report
97-
run: |
98-
python -m pytest tests/ --ignore=tests/test_mcp_fastmcp.py --ignore=tests/test_mcp_server.py --ignore=tests/test_install_skill_e2e.py --cov=src/skill_seekers --cov-report=xml --cov-report=term
99-
timeout-minutes: 30
100-
66+
python -m pytest tests/ -n auto --dist=loadfile \
67+
-m "not slow and not integration and not e2e and not network and not serial and not mcp_only" \
68+
-q --timeout=120 --cov=src/skill_seekers --cov-report=xml --cov-report=term
69+
timeout-minutes: 15
10170
- name: Upload coverage to Codecov
10271
uses: codecov/codecov-action@v4
10372
with:
@@ -106,14 +75,62 @@ jobs:
10675
name: codecov-umbrella
10776
fail_ci_if_error: false
10877

109-
# Summary job that provides a single status check for branch protection.
110-
# The job name MUST match the required status check in the branch
111-
# protection rules. GitHub reports status checks using job names
112-
# (not the workflow name), so the required check "Tests" will only
113-
# be satisfied if a job with exactly that name exists and succeeds.
78+
test-serial:
79+
name: Serial / Integration / E2E Tests
80+
runs-on: ubuntu-latest
81+
needs: [test-fast]
82+
steps:
83+
- uses: actions/checkout@v4
84+
with:
85+
submodules: recursive
86+
- name: Set up Python 3.12
87+
uses: actions/setup-python@v5
88+
with:
89+
python-version: '3.12'
90+
- name: Install dependencies
91+
run: |
92+
python -m pip install --upgrade pip
93+
pip install -r requirements.txt
94+
pip install pytest-timeout
95+
pip install -e .
96+
- name: Run serial/integration/E2E tests
97+
run: |
98+
python -m pytest tests/ \
99+
--ignore=tests/test_bootstrap_skill_e2e.py \
100+
--ignore=tests/test_bootstrap_skill.py \
101+
-m "(integration or e2e or slow or network or serial) and not mcp_only" \
102+
-v --timeout=300
103+
timeout-minutes: 25
104+
105+
test-mcp:
106+
name: MCP Server Tests
107+
runs-on: ubuntu-latest
108+
needs: [test-fast]
109+
steps:
110+
- uses: actions/checkout@v4
111+
with:
112+
submodules: recursive
113+
- name: Set up Python 3.12
114+
uses: actions/setup-python@v5
115+
with:
116+
python-version: '3.12'
117+
- name: Install dependencies
118+
run: |
119+
python -m pip install --upgrade pip
120+
pip install -r requirements.txt
121+
pip install pytest-timeout
122+
pip install -e ".[mcp]"
123+
pip install -e .
124+
- name: Run MCP tests
125+
run: |
126+
python -m pytest tests/ \
127+
-m "mcp_only and not network" \
128+
-v --timeout=180
129+
timeout-minutes: 10
130+
114131
tests-complete:
115132
name: Tests
116-
needs: [lint, test]
133+
needs: [lint, test-fast, test-serial, test-mcp]
117134
runs-on: ubuntu-latest
118135
if: always()
119136
steps:
@@ -123,8 +140,16 @@ jobs:
123140
echo "❌ Code quality checks failed!"
124141
exit 1
125142
fi
126-
if [ "${{ needs.test.result }}" != "success" ]; then
127-
echo "❌ Tests failed!"
143+
if [ "${{ needs.test-fast.result }}" != "success" ]; then
144+
echo "❌ Fast tests failed!"
145+
exit 1
146+
fi
147+
if [ "${{ needs.test-serial.result }}" == "failure" ]; then
148+
echo "❌ Serial/integration tests failed!"
149+
exit 1
150+
fi
151+
if [ "${{ needs.test-mcp.result }}" == "failure" ]; then
152+
echo "❌ MCP tests failed!"
128153
exit 1
129154
fi
130155
echo "✅ All checks passed!"

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,9 @@ skill-seekers-configs/
7070
!distribution/claude-plugin/.mcp.json
7171
settings.json
7272
USER_GUIDE.md
73+
74+
# Local tooling artifacts (per-developer state, not project state)
75+
# chromadb's default persistence directory
76+
chroma_db/
77+
# Superpowers SDK output
78+
docs/superpowers/

AGENTS.md

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# AGENTS.md - Skill Seekers
22

3-
Comprehensive reference for AI coding agents. Skill Seekers is a Python CLI tool (v3.5.0) that converts documentation sites, GitHub repos, PDFs, videos, notebooks, wikis, and more into AI-ready skills for 21+ LLM platforms and RAG pipelines.
3+
Comprehensive reference for AI coding agents. Skill Seekers is a Python CLI tool (v3.6.0) that converts documentation sites, GitHub repos, PDFs, videos, notebooks, wikis, and more into AI-ready skills for 21+ LLM platforms and RAG pipelines.
44

55
## Project Overview
66

@@ -44,46 +44,46 @@ OPENAI_API_KEY # For OpenAI support
4444
GITHUB_TOKEN # For GitHub repo scraping (higher rate limits)
4545
```
4646

47-
## Build / Test / Lint Commands
47+
## Build / Test / Lint
4848

4949
```bash
50-
# Run ALL tests (never skip tests — all must pass before commits)
50+
# Full suite (never skip — all must pass)
5151
pytest tests/ -v
5252

53-
# Run a single test file
54-
pytest tests/test_scraper_features.py -v
53+
# Fast iteration (skip slow, integration, E2E, network, MCP)
54+
pytest tests/ -m "not slow and not integration and not e2e and not network and not serial and not mcp_only" -q
5555

56-
# Run a single test function
57-
pytest tests/test_scraper_features.py::test_detect_language -v
56+
# Fast parallel (install pytest-xdist first)
57+
pytest tests/ -n auto --dist=loadfile -m "not slow and not integration and not e2e and not network and not serial and not mcp_only" -q
58+
59+
# 3-phase runner script (recommended for local dev)
60+
bash scripts/run_tests_fast.sh
5861

59-
# Run a single test class method
60-
pytest tests/test_adaptors/test_claude_adaptor.py::TestClaudeAdaptor::test_package -v
62+
# Single test
63+
pytest tests/test_scraper_features.py::test_detect_language -v
6164

62-
# Skip slow/integration tests
65+
# Skip slow/integration
6366
pytest tests/ -v -m "not slow and not integration"
6467

6568
# With coverage
6669
pytest tests/ --cov=src/skill_seekers --cov-report=term
6770

68-
# Lint (ruff)
71+
# Lint + format check (matches CI)
6972
ruff check src/ tests/
70-
ruff check src/ tests/ --fix
71-
72-
# Format (ruff)
7373
ruff format --check src/ tests/
74-
ruff format src/ tests/
7574

76-
# Type check (mypy)
75+
# Type check (non-blocking — mypy is continue-on-error in CI)
7776
mypy src/skill_seekers --show-error-codes --pretty
7877
```
7978

80-
**Pytest config** (from pyproject.toml): `addopts = "-v --tb=short --strict-markers"`, `asyncio_mode = "auto"`, `asyncio_default_fixture_loop_scope = "function"`.
81-
82-
**Test markers:** `slow`, `integration`, `e2e`, `venv`, `bootstrap`, `benchmark`, `asyncio`.
79+
**Pytest config:** `asyncio_mode = "auto"`, so `@pytest.mark.asyncio` is implicit. Test markers: `slow`, `integration`, `e2e`, `venv`, `bootstrap`, `benchmark`, `asyncio`, `serial`, `network`, `mcp_only`.
8380

84-
**Async tests:** use `@pytest.mark.asyncio`; asyncio_mode is `auto` so the decorator is often implicit.
81+
**CI note:** CI pins `ruff==0.15.8` (not the `>=0.14.13` dev dep). If formatting behaves differently locally, check the CI version.
8582

86-
**Test count:** 160 test files (138 in `tests/`, 22 in `tests/test_adaptors/`).
83+
**CI test phases:** Tests are split into 3 parallel jobs:
84+
- `test-fast` — 3386 unit tests with xdist across OS/Python matrix
85+
- `test-serial` — 69 serial/integration/E2E/network tests
86+
- `test-mcp` — 193 MCP tests (requires `[mcp]` extras)
8787

8888
## Code Style
8989

@@ -187,6 +187,7 @@ docs/ # Documentation (guides, integrations, architecture
187187
```bash
188188
# Core commands
189189
skill-seekers create <source> # Create skill from any source (auto-detects type)
190+
skill-seekers scan <dir> # AI-detect a project's tech stack and emit per-framework configs
190191
skill-seekers enhance <directory> # AI-powered enhancement
191192
skill-seekers package <directory> # Package skill for target platform
192193
skill-seekers upload <file> # Upload skill to target platform

0 commit comments

Comments
 (0)