{"owner":"yusufkaraaslan","repo":"Skill_Seekers","hasSkills":true,"totalSkillsCount":35,"totalTokensCount":44572,"categories":["plugin-manifest","root-instruction","claude-rule","command-prompt","anthropic-skill","project-spec","subagent-persona"],"hasMcp":false,"mcpConfig":null,"found":[".codex-plugin/plugin.json","AGENTS.md","CLAUDE.md","distribution/claude-plugin/.claude-plugin/plugin.json","distribution/claude-plugin/commands/create-skill.md","distribution/claude-plugin/commands/install-skill.md","distribution/claude-plugin/skills/skill-builder/SKILL.md","docs/ARCHITECTURE.md","docs/agents/plans/2026-03-14-epub-input-support.md","docs/agents/research/2026-03-14-epub-input-support-affected-files.md","skills/skill-seekers/SKILL.md","tests/golden/phase2/chat/SKILL.md","tests/golden/phase2/chat_empty/SKILL.md","tests/golden/phase2/chat_single/SKILL.md","tests/golden/phase2/chat_topics/SKILL.md","tests/golden/phase2/epub/SKILL.md","tests/golden/phase2/epub_kw/SKILL.md","tests/golden/phase2/html/SKILL.md","tests/golden/phase2/html_kw/SKILL.md","tests/golden/phase2/html_multi/SKILL.md","tests/golden/phase2/jupyter/SKILL.md","tests/golden/phase2/jupyter_dir/SKILL.md","tests/golden/phase2/jupyter_kw/SKILL.md","tests/golden/phase2/jupyter_topics/SKILL.md","tests/golden/phase2/man/SKILL.md","tests/golden/phase2/man_kw/SKILL.md","tests/golden/phase2/man_single/SKILL.md","tests/golden/phase2/pdf/SKILL.md","tests/golden/phase2/pdf_chapters/SKILL.md","tests/golden/phase2/pdf_kw/SKILL.md","tests/golden/phase2/pptx/SKILL.md","tests/golden/phase2/pptx_kw/SKILL.md","tests/golden/phase2/rss/SKILL.md","tests/golden/phase2/rss_empty/SKILL.md","tests/golden/phase2/word/SKILL.md"],"skills":{".codex-plugin/plugin.json":"{\n  \"name\": \"skill-seekers\",\n  \"version\": \"3.5.0\",\n  \"description\": \"Convert docs and repos into AI skills via MCP\",\n  \"author\": {\n    \"name\": \"yusufkaraaslan\",\n    \"url\": \"https://github.com/yusufkaraaslan/Skill_Seekers\"\n  },\n  \"homepage\": \"https://skillseekersweb.com/\",\n  \"repository\": \"https://github.com/yusufkaraaslan/Skill_Seekers\",\n  \"keywords\": [\"mcp\", \"codex\", \"skills\", \"documentation\"],\n  \"mcpServers\": \"./.mcp.json\",\n  \"skills\": \"./skills/\",\n  \"interface\": {\n    \"displayName\": \"Skill Seekers\",\n    \"shortDescription\": \"Convert docs and repos into AI skills via MCP\",\n    \"longDescription\": \"Convert documentation websites, GitHub repositories, and PDFs into AI skills with automatic conflict detection.\",\n    \"category\": \"Development\",\n    \"websiteURL\": \"https://skillseekersweb.com/\"\n  }\n}\n","AGENTS.md":"# AGENTS.md - Skill Seekers\n\nComprehensive 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.\n\n## Project Overview\n\n**Skill Seekers** is a universal preprocessing layer that transforms raw documentation and code into structured knowledge assets. It supports 17+ source types and exports to 21+ AI platforms including Claude, Gemini, OpenAI, LangChain, LlamaIndex, and various vector databases.\n\n### Key Capabilities\n- **Source Types (17):** Documentation websites, GitHub repos, PDFs, Word docs, EPUBs, videos, local codebases, Jupyter notebooks, HTML, OpenAPI specs, AsciiDoc, PowerPoint, Confluence, Notion, RSS feeds, man pages, chat exports\n- **Export Targets (21):** Claude, Gemini, OpenAI, MiniMax, OpenCode, Kimi, DeepSeek, Qwen, OpenRouter, Together AI, Fireworks AI, Markdown, LangChain, LlamaIndex, Haystack, Weaviate, ChromaDB, FAISS, Qdrant, Pinecone\n- **MCP Server:** FastMCP-based Model Context Protocol server for AI assistant integration\n\n## Setup\n\n```bash\n# REQUIRED before running tests (src/ layout — tests hard-exit if package not installed)\npip install -e .\n\n# With dev tools (pytest, ruff, mypy, coverage)\npip install -e \".[dev]\"\n\n# With specific LLM platform support\npip install -e \".[gemini]\"      # Google Gemini\npip install -e \".[openai]\"      # OpenAI ChatGPT\npip install -e \".[all-llms]\"    # All LLM platforms\n\n# With all optional dependencies (except video-full)\npip install -e \".[all]\"\n\n# Full video processing (heavy dependencies)\npip install -e \".[video-full]\"\n```\n\nNote: `tests/conftest.py` checks that `skill_seekers` is importable and calls `sys.exit(1)` if not. Always install in editable mode first.\n\n### Environment Variables\n\nCreate a `.env` file or export these variables:\n```bash\nANTHROPIC_API_KEY      # For Claude AI enhancement\nGOOGLE_API_KEY         # For Gemini support\nOPENAI_API_KEY         # For OpenAI support\nGITHUB_TOKEN           # For GitHub repo scraping (higher rate limits)\n```\n\n## Build / Test / Lint\n\n```bash\n# Full suite (never skip — all must pass)\npytest tests/ -v\n\n# Fast iteration (skip slow, integration, E2E, network, MCP)\npytest tests/ -m \"not slow and not integration and not e2e and not network and not serial and not mcp_only\" -q\n\n# Fast parallel (install pytest-xdist first)\npytest 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\n\n# 3-phase runner script (recommended for local dev)\nbash scripts/run_tests_fast.sh\n\n# Single test\npytest tests/test_scraper_features.py::test_detect_language -v\n\n# Skip slow/integration\npytest tests/ -v -m \"not slow and not integration\"\n\n# With coverage\npytest tests/ --cov=src/skill_seekers --cov-report=term\n\n# Lint + format check (matches CI)\nruff check src/ tests/\nruff format --check src/ tests/\n\n# Type check (non-blocking — mypy is continue-on-error in CI)\nmypy src/skill_seekers --show-error-codes --pretty\n```\n\n**Pytest config:** `asyncio_mode = \"auto\"`, so `@pytest.mark.asyncio` is implicit. Test markers: `slow`, `integration`, `e2e`, `venv`, `bootstrap`, `benchmark`, `asyncio`, `serial`, `network`, `mcp_only`.\n\n**CI note:** CI pins `ruff==0.15.8` (not the `>=0.14.13` dev dep). If formatting behaves differently locally, check the CI version.\n\n**CI test phases:** Tests are split into 3 parallel jobs:\n- `test-fast` — 3386 unit tests with xdist across OS/Python matrix\n- `test-serial` — 69 serial/integration/E2E/network tests\n- `test-mcp` — 193 MCP tests (requires `[mcp]` extras)\n\n## Code Style\n\n### Formatting Rules (ruff — from pyproject.toml)\n- **Line length:** 100 characters\n- **Target Python:** 3.10+\n- **Enabled lint rules:** E, W, F, I, B, C4, UP, ARG, SIM\n- **Ignored rules:** E501 (line length handled by formatter), F541 (f-string style), ARG002 (unused method args for interface compliance), B007 (intentional unused loop vars), I001 (formatter handles imports), SIM114 (readability preference)\n\n### Imports\n- Sort with isort (via ruff); `skill_seekers` is first-party\n- Standard library → third-party → first-party, separated by blank lines\n- Use `from __future__ import annotations` only if needed for forward refs\n- Guard optional imports with try/except ImportError (see `adaptors/__init__.py` pattern):\n  ```python\n  try:\n      from .claude import ClaudeAdaptor\n      from .minimax import MiniMaxAdaptor\n  except ImportError:\n      ClaudeAdaptor = None\n      MiniMaxAdaptor = None\n  ```\n\n### Naming Conventions\n- **Files:** `snake_case.py` (e.g., `source_detector.py`, `config_validator.py`)\n- **Classes:** `PascalCase` (e.g., `SkillAdaptor`, `ClaudeAdaptor`, `SourceDetector`)\n- **Functions/methods:** `snake_case` (e.g., `get_adaptor()`, `detect_language()`)\n- **Constants:** `UPPER_CASE` (e.g., `ADAPTORS`, `DEFAULT_CHUNK_TOKENS`, `VALID_SOURCE_TYPES`)\n- **Private:** prefix with `_` (e.g., `_read_existing_content()`, `_validate_unified()`)\n\n### Type Hints\n- Gradual typing — add hints where practical, not enforced everywhere\n- Use modern syntax: `str | None` not `Optional[str]`, `list[str]` not `List[str]`\n- MyPy config: `disallow_untyped_defs = false`, `check_untyped_defs = true`, `ignore_missing_imports = true`\n- Tests are excluded from strict type checking (`disallow_untyped_defs = false`, `check_untyped_defs = false` for `tests.*`)\n\n### Docstrings\n- Module-level docstring on every file (triple-quoted, describes purpose)\n- Google-style docstrings for public functions/classes\n- Include `Args:`, `Returns:`, `Raises:` sections where useful\n\n### Error Handling\n- Use specific exceptions, never bare `except:`\n- Provide helpful error messages with context\n- Use `raise ValueError(...)` for invalid arguments, `raise RuntimeError(...)` for state errors\n- Guard optional dependency imports with try/except and give clear install instructions on failure\n- Chain exceptions with `raise ... from e` when wrapping\n\n### Suppressing Lint Warnings\n- Use inline `# noqa: XXXX` comments (e.g., `# noqa: F401` for re-exports, `# noqa: ARG001` for required but unused params)\n\n## Project Layout\n\n```\nsrc/skill_seekers/           # Main package (src/ layout)\n  cli/                       # CLI commands and entry points (100+ files)\n    adaptors/                # Platform adaptors (Strategy pattern, inherit SkillAdaptor)\n    arguments/               # CLI argument definitions (one per source type)\n    parsers/                 # Subcommand parsers (one per source type)\n    storage/                 # Cloud storage (inherit BaseStorageAdaptor)\n    main.py                  # Unified CLI entry point (COMMAND_MODULES dict)\n    source_detector.py       # Auto-detects source type from user input\n    create_command.py        # Unified `create` command routing\n    config_validator.py      # VALID_SOURCE_TYPES set + per-type validation\n    unified_scraper.py       # Multi-source orchestrator (scraped_data + dispatch)\n    unified_skill_builder.py # Pairwise synthesis + generic merge\n  mcp/                       # MCP server (FastMCP + legacy)\n    tools/                   # MCP tool implementations by category (10 files)\n    server_fastmcp.py        # FastMCP server implementation\n    server_legacy.py         # Legacy MCP server\n  sync/                      # Sync monitoring (Pydantic models)\n  benchmark/                 # Benchmarking framework\n  embedding/                 # FastAPI embedding server\n  workflows/                 # 67 YAML workflow presets\n  _version.py                # Reads version from pyproject.toml\ntests/                       # 160 test files (pytest)\n  test_adaptors/             # 22 adaptor-specific test files\n  conftest.py                # Test configuration with package check\nconfigs/                     # Preset JSON scraping configs\ndocs/                        # Documentation (guides, integrations, architecture)\n```\n\n## Key Patterns\n\n**Adaptor (Strategy) pattern** — all platform logic in `cli/adaptors/`. Inherit `SkillAdaptor`, implement `format_skill_md()`, `package()`, `upload()`. Register in `adaptors/__init__.py` ADAPTORS dict.\n\n**Scraper pattern** — each source type has: `cli/<type>_scraper.py` (with `<Type>ToSkillConverter` class + `main()`), `arguments/<type>.py`, `parsers/<type>_parser.py`. Register in `parsers/__init__.py` PARSERS list, `main.py` COMMAND_MODULES dict, `config_validator.py` VALID_SOURCE_TYPES set.\n\n**Unified pipeline** — `unified_scraper.py` dispatches to per-type `_scrape_<type>()` methods. `unified_skill_builder.py` uses pairwise synthesis for docs+github+pdf combos and `_generic_merge()` for all other combinations.\n\n**MCP tools** — grouped in `mcp/tools/` by category. `scrape_generic_tool` handles all new source types.\n\n**CLI subcommands** — git-style in `cli/main.py`. Each delegates to a module's `main()` function.\n\n**Supported source types (17):** documentation (web), github, pdf, local, word, video, epub, jupyter, html, openapi, asciidoc, pptx, confluence, notion, rss, manpage, chat. Each detected automatically by `source_detector.py`.\n\n**Supported platforms (21):** claude, gemini, openai, minimax, opencode, kimi, deepseek, qwen, openrouter, together, fireworks, markdown, langchain, llama-index, haystack, weaviate, chroma, faiss, qdrant, pinecone.\n\n## Web UI (Seeker HUD) — beta\n\n**Status: beta** (since 3.10.0). Screens, API routes and `~/.skill-seekers/ui/` state may change between minor releases; the CLI and MCP server are unaffected.\n\nLocal web app: React 19 + Vite + Tailwind/shadcn frontend in `ui/`, FastAPI backend in `src/skill_seekers/web/`.\n\n```bash\n# Run the app (opens browser; API on :8770)\nskill-seekers ui\n\n# Frontend dev mode (hot reload, proxies /api to :8770)\ncd ui && npm install && npm run dev\n\n# Build frontend (Vite outputs to src/skill_seekers/web/dist, which the\n# backend serves and the wheel bundles as package-data)\ncd ui && npm run build\n```\n\n- Backend deps: `pip install -e \".[ui]\"` (fastapi + uvicorn; also in `[all]` and dev group)\n- **Packaging:** the built SPA is bundled into the wheel from `src/skill_seekers/web/dist` (gitignored; the release workflow runs `npm run build` before `uv build`). `skill-seekers ui` warns if the frontend hasn't been built.\n- Jobs run as subprocesses (`python -m skill_seekers.web.runner`) with streamed logs + `[[PROGRESS:nn]]` markers\n- UI state: `~/.skill-seekers/ui/` (jobs, projects, activity, skill overrides, settings)\n- API tests: `tests/test_web_api.py`\n\n## CLI Commands\n\n```bash\n# Core commands\nskill-seekers create <source>              # Create skill from any source (auto-detects type)\nskill-seekers create <source> --index      # ...plus an opt-in SQLite search index + scripts/search.py\nskill-seekers scan <dir>                   # AI-detect a project's tech stack and emit per-framework configs\nskill-seekers enhance <directory>          # AI-powered enhancement\nskill-seekers package <directory>          # Package skill for target platform\nskill-seekers upload <file>                # Upload skill to target platform\nskill-seekers install <source>             # One-command workflow (scrape + enhance + package + upload)\n\n# Utilities\nskill-seekers estimate <source>            # Estimate page count before scraping\nskill-seekers detect <source> [--json]     # Read-only: how create would classify a source (exit 2 if invalid)\nskill-seekers doctor [--json]              # Health check for dependencies (--json for CI/agents)\nskill-seekers config                       # Configure API keys and settings\nskill-seekers workflows                    # List and apply workflow presets\nskill-seekers resume <job_id>              # Resume interrupted scraping\n\n# Advanced\nskill-seekers stream <source>              # Streaming ingestion\nskill-seekers update <directory>           # Incremental update\nskill-seekers multilang <directory>        # Multi-language support\n```\n\n## Testing Instructions\n\n### Test Structure\n- Unit tests: `tests/test_*.py` — test individual modules\n- Adaptor tests: `tests/test_adaptors/test_*_adaptor.py` — test platform adaptors\n- E2E tests: `tests/test_*_e2e.py` — end-to-end integration tests\n\n### Running Tests\n```bash\n# Fast test run (skip slow/integration tests)\npytest tests/ -v -m \"not slow and not integration\"\n\n# Full test suite\npytest tests/ -v\n\n# With coverage report\npytest tests/ --cov=src/skill_seekers --cov-report=term-missing\n\n# Specific test categories\npytest tests/ -v -m \"slow\"           # Only slow tests\npytest tests/ -v -m \"integration\"    # Only integration tests\npytest tests/ -v -m \"e2e\"            # Only E2E tests\n```\n\n### Test Fixtures\nTest fixtures are located in `tests/fixtures/` and include sample configs, HTML files, and mock data.\n\n## Git Workflow\n\n- **`main`** — production, protected\n- **`development`** — default PR target, active dev\n- Feature branches created from `development`\n\n## Pre-commit Checklist\n\n```bash\nruff check src/ tests/\nruff format --check src/ tests/\npytest tests/ -v -x   # stop on first failure\n```\n\nNever commit API keys. Use env vars: `ANTHROPIC_API_KEY`, `GOOGLE_API_KEY`, `OPENAI_API_KEY`, `GITHUB_TOKEN`.\n\n## CI/CD\n\nGitHub Actions (7 workflows in `.github/workflows/`):\n- **tests.yml** — ruff + mypy lint job, then pytest matrix (Ubuntu + macOS, Python 3.10-3.12) with Codecov upload\n- **release.yml** — tag-triggered: tests → version verification → PyPI publish via `uv build`\n- **test-vector-dbs.yml** — tests vector DB adaptors (weaviate, chroma, faiss, qdrant)\n- **docker-publish.yml** — multi-platform Docker builds (amd64, arm64) for CLI + MCP images\n- **quality-metrics.yml** — quality analysis with configurable threshold\n- **scheduled-updates.yml** — weekly skill updates for popular frameworks\n- **vector-db-export.yml** — weekly vector DB exports\n\n## Deployment\n\n### Docker\nMulti-stage Dockerfile with Python 3.12 slim base:\n```bash\n# Build CLI image\ndocker build -t skill-seekers:local -f Dockerfile .\n\n# Run CLI\ndocker run -v $(pwd)/output:/output skill-seekers:local create https://docs.example.com\n\n# Run MCP server\ndocker build -t skill-seekers-mcp:local -f Dockerfile.mcp .\ndocker run -p 8765:8765 skill-seekers-mcp:local\n```\n\n### MCP Server\nThe MCP server provides Model Context Protocol integration:\n```bash\n# Start FastMCP server\nskill-seekers-mcp\n\n# Or use the Python module\npython -m skill_seekers.mcp.server_fastmcp\n```\n\n## Security Considerations\n\n- **API Keys:** Never commit API keys to version control. Use environment variables or `.env` files (already in `.gitignore`)\n- **Docker:** Runs as non-root user (`skillseeker`, UID 1000)\n- **Dependencies:** Regular security updates via `pip audit` or `safety check`\n- **Sandboxing:** Video processing uses optional dependencies that can be heavy; install `[video-full]` only when needed\n\n## Additional Resources\n\n- **Website:** https://skillseekersweb.com/\n- **Documentation:** https://skillseekersweb.com/\n- **PyPI:** https://pypi.org/project/skill-seekers/\n- **Repository:** https://github.com/yusufkaraaslan/Skill_Seekers\n- **Config Browser:** https://skillseekersweb.com/\n- **Project Board:** https://github.com/users/yusufkaraaslan/projects/2\n","CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\n**Skill Seekers** converts documentation from 18 source types into production-ready formats for 21+ AI platforms (LLM platforms, RAG frameworks, vector databases, AI coding assistants). Published on PyPI as `skill-seekers`.\n\n**Version:** 3.11.0 (dev; last release 3.10.0) — source of truth is `src/skill_seekers/_version.py` | **Python:** 3.10+ | **Website:** https://skillseekersweb.com/\n\n**Architecture:** See `docs/UML_ARCHITECTURE.md` for UML diagrams and module overview. StarUML project at `docs/UML/skill_seekers.mdj`. Refactor state/history: `docs/UNIFICATION_PLAN.md` (Grand Unification — all 5 phases done; remaining cosmetic items listed there).\n\n## Essential Commands\n\n```bash\n# REQUIRED before running tests or CLI (src/ layout)\npip install -e .\n\n# Run all tests (NEVER skip - all must pass before commits)\npytest tests/ -v\n\n# Fast iteration (skip slow MCP tests ~20min)\npytest tests/ --ignore=tests/test_mcp_fastmcp.py --ignore=tests/test_mcp_server.py --ignore=tests/test_install_skill_e2e.py -q\n\n# Single test\npytest tests/test_scraper_features.py::test_detect_language -vv -s\n\n# Code quality (must pass before push - matches CI)\nuvx ruff check src/ tests/\nuvx ruff format --check src/ tests/\nmypy src/skill_seekers  # continue-on-error in CI\n\n# Auto-fix lint/format issues\nuvx ruff check --fix --unsafe-fixes src/ tests/\nuvx ruff format src/ tests/\n\n# Build & publish\nuv build\nuv publish\n```\n\n## CI Matrix\n\nRuns on push/PR to `main` or `development`. Lint job (Python 3.12, Ubuntu) + Test job (Ubuntu + macOS, Python 3.10/3.11/3.12, excludes macOS+3.10). Both must pass for merge.\n\n## Git Workflow\n\n- **Main branch:** `main` (requires tests + 1 review)\n- **Development branch:** `development` (default PR target, requires tests)\n- **Feature branches:** `feature/{task-id}-{description}` from `development`\n- PRs always target `development`, never `main` directly\n\n## Architecture\n\n### CLI: Unified create command\n\nEntry point `src/skill_seekers/cli/main.py`. The `create` command is the **primary** entry point for skill creation — it auto-detects source type and routes to the appropriate `SkillConverter`. The `scan` command (added in #327) is a separate discovery step for projects with multiple frameworks; it emits one config file per detected framework and you then run `create` on each.\n\n```\nskill-seekers create <source>     # Auto-detect: URL, owner/repo, ./path, file.pdf, etc.\nskill-seekers scan <dir>          # AI-driven discovery → emits one config per detected framework + <project>-codebase.json\nskill-seekers package <dir>       # Package for platform (--target claude/gemini/openai/markdown/minimax/opencode/kimi/deepseek/qwen/openrouter/together/fireworks/atlas/langchain/llama-index/haystack/chroma/faiss/weaviate/qdrant/pinecone/ibm-bob)\n```\n\n### Scan command (issue #327)\n\n`skill-seekers scan <dir>` is an AI-driven project knowledge-base bootstrapper. Pipeline in `src/skill_seekers/cli/scan_command.py`:\n\n1. `collect_signals()` in `signal_collectors.py` — deterministic, bounded gathering of manifests + README + Dockerfile/CI + sampled source files + git remote. **Per-kind byte budgets** (24 KB manifest / 6 KB README / 6 KB CI / 28 KB samples, total 64 KB) so a fat package.json can't crowd out other kinds. `_SOURCE_DIRS` covers ~14 layouts (Go `cmd/`, Rust `crates/`, JS monorepo `apps/packages/`, Maven `source/`, Django at root); also walks root one level deep for flat-layout Python.\n2. `detect_with_ai(bundle, AgentClient)` — one LLM call, structured JSON output. **Source signals are first-2-KB of each file** (whole-file sampling, no regex parsing — added in WS4 because regex missed Go multi-line imports + Rust `mod`/`extern crate`). Canonical-slug prompt + the canonical-name resolver are coupled — change one, update the other.\n3. `resolve_or_generate_with_status()` — for each detection: try `out_dir/<slug>.json` (cache from prior run), then `resolve_config_path` from `config_fetcher` with multiple canonical name candidates (`_canonical_name_candidates` handles `\"Godot Engine\"` → `\"godot\"`, plus CJK / European suffixes like `\"Godot 引擎\"`, `\"React フレームワーク\"`, `\"Lodash Bibliothek\"`), then `generate_config_with_ai` as the last resort. Always appends `.json` to lookup names so local-disk and user-dir resolution actually finds files. Always stamps `metadata.detected_version` (nested, not top-level — `metadata.version` already exists and means config-schema version).\n4. `emit_codebase_config()` — always writes `<project>-codebase.json` (a `type: local` source pointed at the project root).\n5. `diff_against_existing()` — keyed by **filename slug** (not internal `data[\"name\"]`) so re-scans don't churn when the AI returns a display name vs the registry canonical slug.\n6. `_archive_removed()` — when a config disappears from detections, MOVE (not delete — user may have hand-edited) to `out_dir/.archived/<UTC-timestamp>/`. Runs after diff, before fresh writes.\n7. `maybe_publish()` — **native async** (WS11). Opt-in submission of freshly AI-generated configs to the community registry. Pre-checks `GITHUB_TOKEN`. Idempotency guard: `_find_existing_issue` queries GitHub Search API for an existing open issue with the same config name before submitting. Retries transient failures (rate limit, 5xx) with 0s/5s/15s backoff. `_prompt_async` wraps `input()` via `asyncio.to_thread` so the event loop isn't blocked.\n\n**CLI dispatch** uses the `COMMAND_CLASSES` table in `main.py` (added in WS1). `scan` and `doctor` are dispatched as `Cls(args).execute()` consuming the parsed argparse namespace directly — no `_reconstruct_argv` hack, no duplicate argparse. `ScanCommand.execute()` is the single `asyncio.run` boundary wrapping `run_scan` (sync) + `maybe_publish` (async). Remaining ~14 commands still use the legacy `COMMAND_MODULES` dispatch; they're flagged for migration.\n\n**Cost guardrails**: `--max-ai-generations N` (default 10) caps unbounded AI generation; `--dry-run` previews without writing or invoking AI; `--probe-urls` HEAD-checks AI-generated URLs with retry-on-404 and stamps `metadata._url_unverified` on confirmed-bad URLs.\n\n**Safety**: All writes use `_atomic_write_json` (`os.replace` after writing to `.tmp`) so a `KeyboardInterrupt` mid-write can't corrupt configs. `_safe_size` guards `stat()` so broken symlinks don't crash the scan. `ScanCommand.execute` calls `logging.basicConfig` so `logger.warning`/`error` is visible; exit code is non-zero when no configs and no codebase config were emitted.\n\n**Public constant**: `SourceDetector.CODE_PROJECT_MARKERS` (was `_CODE_PROJECT_MARKERS`) — shared between source_detector + signal_collectors. ~50 manifest types now (Pipfile, environment.yml, deno.json, flake.nix, Chart.yaml, deps.edn, dune-project, BUILD.bazel, …). Public so cross-module access doesn't reach into a private attribute.\n\n### SkillConverter Pattern (Template Method + Factory)\n\nAll 18 source types implement the `SkillConverter` base class (`skill_converter.py`):\n\n```python\nconverter = get_converter(\"web\", config)  # Factory lookup\nconverter.run()  # Template: extract() → build_skill()\n```\n\nRegistry in `CONVERTER_REGISTRY` maps source type → (module, class). `create_command.py` builds config from `ExecutionContext`, calls `get_converter()`, then runs centralized enhancement. `get_converter(\"config\", {...})` constructs `UnifiedScraper` from the same factory-shaped dict (no special cases in create_command/MCP). The base resolves `skill_dir` once (strips trailing separators) and derives `data_file` via `data_file_for()` — subclasses must not re-derive paths.\n\n### DocumentSkillBuilder (build side of 9 document scrapers)\n\n`cli/document_skill_builder.py:DocumentSkillBuilder` sits between `SkillConverter` and the 9 document scrapers (epub, word, pptx, html, pdf, jupyter, man, rss, chat). It owns `categorize_content`, reference-file writing (tables, truncation, image guard), `index.md` + `SKILL.md` generation, and `load_extracted_data`. Variation points are class attrs (`DOC_NOUN`, `SOURCE_LABEL`, `LOAD_TOTAL_KEY`, `PATTERN_KEYWORDS`, `RANGE_LABEL`, …) and small hook methods (`category_stem`, `_write_reference_section`, `_write_skill_md_metadata`). Output is pinned **byte-identical** by golden trees in `tests/golden/phase2/` — `UPDATE_GOLDENS=1` rewrites them, only do that deliberately. Surviving full-method overrides are domain-shaped and commented per scraper.\n\n### UnifiedScraper (multi-source configs)\n\n`unified_scraper.py` dispatches via the class-level `SOURCE_DISPATCH` table; `_scrape_with_converter()` is the shared engine for the 13 mechanical source types (`get_converter()` + public `converter.extract()` + cache copy + sub-skill build), so **new types registered in `CONVERTER_REGISTRY` work in unified configs automatically**. documentation/github/local stay bespoke (commented why). `run()` deliberately does NOT follow the base template (TestRunOrchestration pins that run() triggers workflows).\n\n### Data Flow (5 phases)\n\n1. **Scrape** - Source-specific scraper extracts content to `output/{name}_data/pages/*.json`\n2. **Build** - `build_skill()` categorizes pages, extracts patterns, generates `output/{name}/SKILL.md`\n3. **Enhance** (optional) - LLM rewrites SKILL.md (`--enhance-level 0-3`, auto-detects API vs LOCAL mode)\n4. **Package** - Platform adaptor formats output (`.zip`, `.tar.gz`, JSON, vector index)\n5. **Upload** (optional) - Platform API upload\n\n### Platform Adaptor Pattern (Strategy + Factory)\n\nFactory: `get_adaptor(platform, config)` in `adaptors/__init__.py` returns a `SkillAdaptor` instance. Base class `SkillAdaptor` + `SkillMetadata` in `adaptors/base.py`.\n\n```\nsrc/skill_seekers/cli/adaptors/\n├── __init__.py              # Factory: get_adaptor(platform, config), ADAPTORS registry\n├── base.py                  # Abstract base: SkillAdaptor, SkillMetadata\n├── openai_compatible.py     # Shared base for OpenAI-compatible platforms\n├── claude.py                # --target claude\n├── gemini.py                # --target gemini\n├── openai.py                # --target openai\n├── markdown.py              # --target markdown\n├── minimax.py               # --target minimax\n├── opencode.py              # --target opencode\n├── kimi.py                  # --target kimi\n├── deepseek.py              # --target deepseek\n├── qwen.py                  # --target qwen\n├── openrouter.py            # --target openrouter\n├── together.py              # --target together\n├── fireworks.py             # --target fireworks\n├── langchain.py             # --target langchain\n├── llama_index.py           # --target llama-index\n├── haystack.py              # --target haystack\n├── chroma.py                # --target chroma\n├── faiss_helpers.py         # --target faiss\n├── qdrant.py                # --target qdrant\n├── weaviate.py              # --target weaviate\n├── pinecone_adaptor.py      # --target pinecone\n└── streaming_adaptor.py     # --target streaming\n```\n\nAll adaptors use `--target`. All adaptors are imported with `try/except ImportError` so missing optional deps don't break the registry.\n\n### 18 Source Type Converters\n\nEach in `src/skill_seekers/cli/{type}_scraper.py` as a `SkillConverter` subclass (no `main()`). The `create_command.py` uses `source_detector.py` to auto-detect, then calls `get_converter()`. Converters: web (doc_scraper), github, pdf, word, epub, video, local (codebase_scraper), jupyter, html, openapi, asciidoc, pptx, rss, manpage, confluence, notion, chat, config (unified_scraper).\n\n### CLI Argument System (single-definition parsers)\n\n```\nsrc/skill_seekers/cli/\n├── parsers/              # Central SubcommandParser classes — the ONLY definition of each command's flags\n│   └── create_parser.py  # Progressive help disclosure (--help-web, --help-github, etc.)\n├── arguments/            # Argument definitions\n│   ├── common.py         # add_all_standard_arguments() - shared across all scrapers\n│   └── create.py         # UNIVERSAL_ARGUMENTS, WEB_ARGUMENTS, GITHUB_ARGUMENTS, etc.\n├── exit_codes.py         # EXIT_SUCCESS/ERROR/VALIDATION/INTERRUPT\n└── source_detector.py    # Auto-detect source type from input string\n```\n\nCommand modules' standalone `main(args=None)` paths build their parser FROM the central `SubcommandParser` class — **add/change a flag in `parsers/*.py` only**. Drift guards (`tests/test_cli_parsers.py::TestCentralModuleParserSync` and `TestCentralParserSingleSource`) fail CI on any divergence of dests/defaults/option strings.\n\n`ExecutionContext.override()` is context-local (a `ContextVar` layered over the unchanged base singleton) — thread/async safe for the MCP server; propagate to worker threads via `copy_context`.\n\n### Standalone subsystems (outside `cli/`)\n\nFour top-level packages sit beside `cli/` and are largely independent of the scrape→build→package flow:\n\n- `embedding/` — FastAPI embedding-generation server (`python -m skill_seekers.embedding.server`) with a caching layer (`cache.py`) and multi-backend generators (OpenAI, sentence-transformers, Anthropic). Feeds the vector-DB adaptors.\n- `sync/` — real-time doc-sync system: `detector.py` (content-hash / last-modified change detection), `monitor.py` (scheduled incremental re-scrapes), `notifier.py` (email/Slack/webhook). Keeps generated skills fresh as upstream docs change.\n- `benchmark/` — performance suite (`runner.py`, `framework.py`) measuring scrape/embedding/storage/e2e timing, memory, and CPU; emits comparison + optimization reports.\n- `workflows/` — bundled default enhancement-workflow presets consumed by the enhancement step.\n\n### C3.x Codebase Analysis Pipeline\n\nLocal codebase analysis features, all opt-out (`--skip-*` flags):\n- C3.1 `pattern_recognizer.py` - Design pattern detection (10 GoF patterns, 9 languages)\n- C3.2 `test_example_extractor.py` - Usage examples from tests\n- C3.3 `how_to_guide_builder.py` - AI-enhanced educational guides\n- C3.4 `config_extractor.py` - Configuration pattern extraction\n- C3.5 `generate_router.py` - Architecture overview generation\n- C3.10 `signal_flow_analyzer.py` - Godot signal flow analysis\n\n### MCP Server\n\n`src/skill_seekers/mcp/server_fastmcp.py` - 40 tools via FastMCP. Transport: stdio (Claude Code) or HTTP (Cursor/Windsurf). Optional dependency: `pip install -e \".[mcp]\"`\n\n- **Tools run in-process** via `run_cli_main()` in `mcp/tools/_common.py`: same argv parsed by the command's REAL parser (sys.argv patch under a lock), stdout/stderr capture + contextvar log capture, identical `(stdout, stderr, returncode)` contract. No subprocess startup; old hard timeouts are advisory.\n- **Exceptions BY DESIGN**: `enhance_skill` (LOCAL agent) and `install_skill`'s enhancement step stay subprocess — the agent must be a real child process for the fork-bomb-guard env semantics (`SKILL_SEEKER_ENHANCE_ACTIVE`). Never make these in-process.\n- **Domain logic lives in `skill_seekers.services/`** (marketplace_manager, marketplace_publisher, config_publisher, source_manager, git_repo) — importable by CLI without the `[mcp]` extra; old `skill_seekers.mcp.*` paths are back-compat shims. No `sys.path` hacks anywhere in `mcp/`.\n\n### Seeker HUD (web UI)\n\nFastAPI backend in `src/skill_seekers/web/`, React app in `ui/`; see `docs/guides/WEB_UI.md`.\n\n- HUD routes live in `src/skill_seekers/web/routes/` (one module per screen, `register(app, ctx)`); `app.py` keeps the original routes.\n\n### Enhancement (AgentClient is the single AI transport)\n\nEvery AI call goes through `AgentClient` (`src/skill_seekers/cli/agent_client.py`): central truncation gate, timeout policy, error classification. `API_PROVIDERS` (provider registry) and `AGENT_PRESETS` (local-agent command templates) live ONLY there. Each `API_PROVIDERS` entry declares its wire `protocol` (`anthropic`/`openai`/`google`) and `supports_images` capability — `_call_api` branches on the resolved protocol, NOT the provider name, so an OpenAI/Anthropic-compatible provider needs no new branch. Adaptors declare provider/endpoint/model/prompt and route through `SkillAdaptor._enhance_skill_md_via_client` (atomic save with backup). Multimodal image input goes through `AgentClient.call_with_image()` (used by `video_visual` frame OCR across all image-capable providers); it no longer bypasses AgentClient with a direct SDK call.\n\n- **API mode** (if API key set): Anthropic, Google Gemini, OpenAI, Moonshot/Kimi, MiniMax — detected in registry order; `SKILL_SEEKER_PROVIDER` forces one. Models: `SKILL_SEEKER_MODEL` (global) or `ANTHROPIC_MODEL`/`GOOGLE_MODEL`/`OPENAI_MODEL`/`MOONSHOT_MODEL`/`MINIMAX_MODEL`; `ANTHROPIC_BASE_URL` for compatible endpoints. MiniMax adds `MINIMAX_API_REGION` (`global_en`/`cn_zh`), `MINIMAX_API_PROTOCOL` (`openai`/`anthropic`) and `MINIMAX_THINKING` (`adaptive`/`disabled`, OpenAI protocol only; validated at `AgentClient` construction). Video input (`AgentClient.call_with_video()`, MiniMax-M3 only, 50 MB cap) is registry-driven like images: `supports_video`, `video_models`, `video_max_bytes`, `thinking_modes`, `thinking_env` on the provider entry. Vision OCR provider: `SKILL_SEEKER_VISION_PROVIDER` (`auto` picks the first image-capable provider with a key).\n- **LOCAL mode** (fallback): Claude Code, Kimi Code, Codex, Copilot, OpenCode, custom agents — command built by `build_local_agent_command()`.\n- Control: `--enhance-level 0` (off) / `1` (SKILL.md only) / `2` (default, balanced) / `3` (full)\n- Agent selection: `--agent claude|codex|copilot|opencode|kimi|custom`\n\n## Key Implementation Details\n\n### Smart Categorization (`doc_scraper.py:smart_categorize()`)\n\nScores pages against category keywords: 3 points for URL match, 2 for title, 1 for content. Threshold of 2+ required. Falls back to \"other\".\n\n### Content Extraction (`doc_scraper.py`)\n\n`FALLBACK_MAIN_SELECTORS` constant + `_find_main_content()` helper handle CSS selector fallback. Links are extracted from the full page before early return (not just main content). `body` is deliberately excluded from fallbacks.\n\n### Three-Stream GitHub Architecture (`unified_codebase_analyzer.py`)\n\nStream 1: Code Analysis (AST, patterns, tests, guides). Stream 2: Documentation (README, docs/, wiki). Stream 3: Community (issues, PRs, metadata). Depth control: `basic` (1-2 min) or `c3x` (20-60 min).\n\n## Testing\n\n### Test markers (pytest.ini)\n\n```bash\npytest tests/ -v                                    # Default: fast tests only\npytest tests/ -v -m slow                            # Include slow tests (>5s)\npytest tests/ -v -m integration                     # External services required\npytest tests/ -v -m e2e                             # Resource-intensive\npytest tests/ -v -m \"not slow and not integration\"  # Fastest subset\n```\n\n### Known legitimate skips (~11)\n\n- 2: chromadb incompatible with Python 3.14 (pydantic v1)\n- 2: weaviate-client not installed\n- 2: Qdrant not running (requires docker)\n- 2: langchain/llama_index not installed\n- 3: GITHUB_TOKEN not set\n\n### sys.modules gotcha\n\n`test_swift_detection.py` deletes `skill_seekers.cli` modules from `sys.modules`. It must save and restore both `sys.modules` entries AND parent package attributes (`setattr`). See the test file for the pattern.\n\n## Dependencies\n\nCore deps include `langchain`, `llama-index`, `anthropic`, `httpx`, `PyMuPDF`, `pydantic`. Platform-specific deps are optional:\n\n```bash\npip install -e \".[mcp]\"       # MCP server\npip install -e \".[gemini]\"    # Google Gemini\npip install -e \".[openai]\"    # OpenAI\npip install -e \".[docx]\"      # Word documents\npip install -e \".[epub]\"      # EPUB books\npip install -e \".[video]\"     # Video (lightweight)\npip install -e \".[video-full]\"# Video (Whisper + visual)\npip install -e \".[jupyter]\"   # Jupyter notebooks\npip install -e \".[pptx]\"      # PowerPoint\npip install -e \".[rss]\"       # RSS/Atom feeds\npip install -e \".[confluence]\"# Confluence wiki\npip install -e \".[notion]\"    # Notion pages\npip install -e \".[chroma]\"    # ChromaDB\npip install -e \".[all]\"       # Everything (except video-full)\n```\n\nDev dependencies use PEP 735 `[dependency-groups]` in pyproject.toml.\n\n## Environment Variables\n\n```bash\nANTHROPIC_API_KEY=sk-ant-...          # Claude AI (or compatible endpoint)\nANTHROPIC_BASE_URL=https://...        # Optional: Claude-compatible API endpoint\nGOOGLE_API_KEY=AIza...                # Google Gemini (optional)\nOPENAI_API_KEY=sk-...                 # OpenAI (optional)\nGITHUB_TOKEN=ghp_...                  # Higher GitHub rate limits\n```\n\n## Adding New Features\n\n### New platform adaptor\n1. Create `src/skill_seekers/cli/adaptors/{platform}.py` inheriting `SkillAdaptor` from `base.py`\n2. Register in `adaptors/__init__.py` (add try/except import + add to `ADAPTORS` dict)\n3. Add optional dep to `pyproject.toml`\n4. Add tests in `tests/`\n\n### New source type converter\n1. Create `src/skill_seekers/cli/{type}_scraper.py` — for document-shaped sources inherit `DocumentSkillBuilder` (categorization/references/index/SKILL.md come free; implement `extract()` + hooks), otherwise inherit `SkillConverter` and implement `extract()` and `build_skill()`. Set `SOURCE_TYPE`.\n2. Register in `CONVERTER_REGISTRY` in `skill_converter.py` — this also makes the type work in unified configs automatically (UnifiedScraper engine)\n3. Add source type config building in `create_command.py:_build_config()`\n4. Add auto-detection in `source_detector.py`\n5. Add optional dep if needed\n6. Add tests\n\n### New CLI argument\n- Subcommand flag: define ONLY in the central parser class (`parsers/{cmd}_parser.py`) — module `main()` builds from it; the drift-guard test fails otherwise\n- Universal: `UNIVERSAL_ARGUMENTS` in `arguments/create.py`\n- Source-specific: appropriate dict (`WEB_ARGUMENTS`, `GITHUB_ARGUMENTS`, etc.)\n- Shared across scrapers: `add_all_standard_arguments()` in `arguments/common.py`\n","distribution/claude-plugin/.claude-plugin/plugin.json":"{\n  \"name\": \"skill-seekers\",\n  \"description\": \"Transform 18 source types (docs, GitHub, PDFs, videos, Jupyter, Confluence, Notion, Slack, and more) into AI-ready skills and RAG knowledge for 21+ AI platforms.\",\n  \"version\": \"3.9.1\",\n  \"author\": {\n    \"name\": \"Yusuf Karaaslan\"\n  },\n  \"homepage\": \"https://github.com/yusufkaraaslan/Skill_Seekers\",\n  \"repository\": \"https://github.com/yusufkaraaslan/Skill_Seekers\",\n  \"license\": \"MIT\"\n}\n","distribution/claude-plugin/commands/create-skill.md":"---\ndescription: Create an AI skill from any source (URL, repo, PDF, video, notebook, etc.)\n---\n\n# Create Skill\n\nCreate an AI-ready skill from a source. The source type is auto-detected.\n\n## Usage\n\n```\n/skill-seekers:create-skill <source> [--preset <level>] [--output <dir>]\n```\n\n## Instructions\n\nWhen the user provides a source via `$ARGUMENTS`, run the `skill-seekers create` command to generate a skill.\n\n1. Parse the arguments: extract the source (first argument) and any flags.\n2. If no `--preset` is specified, default to `quick` for fast results.\n3. If no `--output` is specified, default to `./output`.\n4. Run the create command:\n   ```bash\n   skill-seekers create \"$SOURCE\" --preset quick --output \"$OUTPUT\"\n   ```\n5. After completion, read the generated `SKILL.md` and summarize what was created.\n6. If the user wants to target a specific platform (e.g., Claude, OpenAI, LangChain), run the package command after:\n   ```bash\n   skill-seekers package \"$SKILL_DIR\" --target \"$PLATFORM\"\n   ```\n\n## Presets\n\n- `-p quick` — 1-2 minutes, basic skill\n- `-p standard` — 5-10 minutes, good coverage\n- `-p comprehensive` — 20-60 minutes, full analysis\n\n## Source Types (auto-detected)\n\n- **URL** (https://...) — Documentation scraping\n- **owner/repo** or github.com URL — GitHub repo analysis\n- **file.pdf** — PDF extraction\n- **file.ipynb** — Jupyter notebook\n- **file.docx** — Word document\n- **file.epub** — EPUB book\n- **YouTube/Vimeo URL** — Video transcript\n- **./directory** — Local codebase analysis\n- **file.yaml** with OpenAPI — API spec\n- **file.pptx** — PowerPoint\n- **file.adoc** — AsciiDoc\n- **file.html** — HTML page\n- **file.rss** — RSS/Atom feed\n- **cmd.1** — Man page\n\n## Examples\n\n```\n/skill-seekers:create-skill https://react.dev\n/skill-seekers:create-skill pallets/flask -p standard\n/skill-seekers:create-skill ./docs/api.pdf\n/skill-seekers:create-skill https://youtube.com/watch?v=abc123\n```\n","distribution/claude-plugin/commands/install-skill.md":"---\ndescription: One-command skill creation and packaging for a target platform\n---\n\n# Install Skill\n\nEnd-to-end workflow: create a skill from any source, then package it for a target LLM platform.\n\n## Usage\n\n```\n/skill-seekers:install-skill <source> [--target <platform>] [--preset <level>]\n```\n\n## Instructions\n\nWhen the user provides a source via `$ARGUMENTS`:\n\n1. Parse the arguments: extract source, `--target` (default: claude), `--preset` (default: quick).\n2. Run the create command:\n   ```bash\n   skill-seekers create \"$SOURCE\" --preset \"$PRESET\" --output ./output\n   ```\n3. Find the generated skill directory (look for the directory containing SKILL.md in ./output/).\n4. Run the package command for the target platform:\n   ```bash\n   skill-seekers package \"$SKILL_DIR\" --target \"$TARGET\"\n   ```\n5. Report what was created and where to find the packaged output.\n\n## Target Platforms\n\n`claude` (default), `openai`, `gemini`, `langchain`, `llama-index`, `haystack`, `markdown`, `chroma`, `weaviate`, `faiss`, `qdrant`, `pinecone`, `deepseek`, `kimi`, `qwen`, `fireworks`, `openrouter`, `together`, `minimax`, `opencode`, `ibm-bob`\n\n> **IDE-specific installs** (`cursor`, `windsurf`, `continue`, `cline`) are not standalone `--target` values. Use `skill-seekers install-agent` or manually copy the output from `--target markdown` or `--target claude`.\n\n## Examples\n\n```\n/skill-seekers:install-skill https://react.dev --target claude\n/skill-seekers:install-skill pallets/flask --target langchain -p standard\n/skill-seekers:install-skill ./docs/api.pdf --target openai\n```\n","distribution/claude-plugin/skills/skill-builder/SKILL.md":"---\nname: skill-builder\ndescription: Automatically detect source types and build AI skills using Skill Seekers. Use when the user wants to create skills from documentation, repos, PDFs, videos, or other knowledge sources.\n---\n\n# Skill Builder\n\nThis skill uses the Skill Seekers MCP server, which provides 40 tools for converting knowledge sources into AI-ready skills. If the MCP tools are not available, use the CLI fallback at the bottom of this file instead — do not stop.\n\n## Prerequisites\n\nThe MCP tools below only work when the Skill Seekers MCP server is connected:\n\n1. Install the package: `pip install \"skill-seekers[mcp]\"`\n2. Connect the server:\n   - Installed as the Skill Seekers plugin? Nothing to do — the plugin's bundled `.mcp.json` starts the server automatically (it still needs step 1).\n   - Installed standalone (e.g. copied into `~/.claude/skills/`)? Register the server once: `claude mcp add skill-seekers -- python -m skill_seekers.mcp.server_fastmcp`\n\nIf tools like `scrape_docs` or `package_skill` are not in your tool list, the server is not connected. Tell the user about the two steps above, and use the CLI fallback in the meantime.\n\n## When to Use This Skill\n\nUse this skill when the user:\n- Wants to create an AI skill from a documentation site, GitHub repo, PDF, video, or other source\n- Needs to convert documentation into a format suitable for LLM consumption\n- Wants to update or sync existing skills with their source documentation\n- Needs to export skills to vector databases (Weaviate, Chroma, FAISS, Qdrant)\n- Asks about scraping, converting, or packaging documentation for AI\n\n## Source Type Detection\n\nAutomatically detect the source type from user input:\n\n| Input Pattern | Source Type | Tool to Use |\n|---------------|-------------|-------------|\n| `https://...` (not GitHub/YouTube) | Documentation | `scrape_docs` |\n| `owner/repo` or `github.com/...` | GitHub | `scrape_github` |\n| `*.pdf` | PDF | `scrape_pdf` |\n| YouTube/Vimeo URL or video file | Video | `scrape_video` |\n| Local directory path | Codebase | `scrape_codebase` |\n| `*.ipynb`, `*.html`, `*.yaml` (OpenAPI), `*.adoc`, `*.pptx`, `*.rss`, `*.1`-`.8` | Various | `scrape_generic` |\n| JSON config file | Unified | Use config with `scrape_docs` |\n\n## Recommended Workflow\n\n1. **Detect source type** from the user's input\n2. **Generate or fetch config** using `generate_config` or `fetch_config` if needed\n3. **Estimate scope** with `estimate_pages` for documentation sites\n4. **Scrape the source** using the appropriate scraping tool\n5. **Enhance** with `enhance_skill` if the user wants AI-powered improvements\n6. **Package** with `package_skill` for the target platform\n7. **Export to vector DB** if requested using `export_to_*` tools\n\n## Available MCP Tools\n\n### Config Management\n- `generate_config` — Generate a scraping config from a URL\n- `list_configs` — List available preset configs\n- `validate_config` — Validate a config file\n\n### Scraping (use based on source type)\n- `scrape_docs` — Documentation sites\n- `scrape_github` — GitHub repositories\n- `scrape_pdf` — PDF files\n- `scrape_video` — Video transcripts\n- `scrape_codebase` — Local code analysis\n- `scrape_generic` — Jupyter, HTML, OpenAPI, AsciiDoc, PPTX, RSS, manpage, Confluence, Notion, chat\n\n### Post-processing\n- `enhance_skill` — AI-powered skill enhancement\n- `package_skill` — Package for target platform\n- `upload_skill` — Upload to platform API\n- `install_skill` — End-to-end install workflow\n\n### Advanced\n- `detect_patterns` — Design pattern detection in code\n- `extract_test_examples` — Extract usage examples from tests\n- `build_how_to_guides` — Generate how-to guides from tests\n- `split_config` — Split large configs into focused skills\n- `export_to_weaviate`, `export_to_chroma`, `export_to_faiss`, `export_to_qdrant` — Vector DB export\n\n## CLI Fallback (MCP server not connected)\n\nThe same pipeline is available from the command line (requires `pip install skill-seekers`). Run it with the Bash tool:\n\n```bash\nskill-seekers create <source>                      # auto-detects: URL, owner/repo, ./path, file.pdf, video URL, ...\nskill-seekers package <skill_dir> --target claude  # or gemini/openai/langchain/chroma/...\n```\n\n`create` covers detection, scraping, and building in one step; add `--enhance-level 0` to skip AI enhancement. After it finishes, read the generated `SKILL.md` and summarize what was created.\n","docs/ARCHITECTURE.md":"# Documentation Architecture\n\n> **How Skill Seekers documentation is organized (v3.6.0 - 18 source types)**\n\n---\n\n## Philosophy\n\nOur documentation follows these principles:\n\n1. **Progressive Disclosure** - Start simple, add complexity as needed\n2. **Task-Oriented** - Organized by what users want to do\n3. **Single Source of Truth** - One authoritative reference per topic\n4. **Version Current** - Always reflect the latest release\n\n---\n\n## Directory Structure\n\n```\ndocs/\n├── README.md              # Entry point - navigation hub\n├── ARCHITECTURE.md        # This file\n│\n├── getting-started/       # New users (lowest cognitive load)\n│   ├── 01-installation.md\n│   ├── 02-quick-start.md\n│   ├── 03-your-first-skill.md\n│   └── 04-next-steps.md\n│\n├── user-guide/            # Common tasks (practical focus)\n│   ├── 01-core-concepts.md\n│   ├── 02-scraping.md\n│   ├── 03-enhancement.md\n│   ├── 04-packaging.md\n│   ├── 05-workflows.md\n│   └── 06-troubleshooting.md\n│\n├── reference/             # Technical details (comprehensive)\n│   ├── CLI_REFERENCE.md\n│   ├── MCP_REFERENCE.md\n│   ├── CONFIG_FORMAT.md\n│   └── ENVIRONMENT_VARIABLES.md\n│\n└── advanced/              # Power users (specialized)\n    ├── mcp-server.md\n    ├── mcp-tools.md\n    ├── custom-workflows.md\n    └── multi-source.md\n```\n\n---\n\n## Category Guidelines\n\n### Getting Started\n\n**Purpose:** Get new users to their first success quickly\n\n**Characteristics:**\n- Minimal prerequisites\n- Step-by-step instructions\n- Copy-paste ready commands\n- Screenshots/output examples\n\n**Files:**\n- `01-installation.md` - Install the tool\n- `02-quick-start.md` - 3 commands to first skill\n- `03-your-first-skill.md` - Complete walkthrough\n- `04-next-steps.md` - Where to go after first success\n\n---\n\n### User Guide\n\n**Purpose:** Teach common tasks and concepts\n\n**Characteristics:**\n- Task-oriented\n- Practical examples\n- Best practices\n- Common patterns\n\n**Files:**\n- `01-core-concepts.md` - How it works\n- `02-scraping.md` - All 18 source types (docs, GitHub, PDF, video, Word, EPUB, Jupyter, HTML, OpenAPI, AsciiDoc, PPTX, RSS, man pages, Confluence, Notion, Slack/Discord, local codebase)\n- `03-enhancement.md` - AI enhancement\n- `04-packaging.md` - Platform export\n- `05-workflows.md` - Workflow presets\n- `06-troubleshooting.md` - Problem solving\n\n---\n\n### Reference\n\n**Purpose:** Authoritative technical information\n\n**Characteristics:**\n- Comprehensive\n- Precise\n- Organized for lookup\n- Always accurate\n\n**Files:**\n- `CLI_REFERENCE.md` - All CLI commands (including 17 source-type subcommands)\n- `MCP_REFERENCE.md` - 40 MCP tools\n- `CONFIG_FORMAT.md` - JSON schema (covers all 18 source types)\n- `ENVIRONMENT_VARIABLES.md` - All env vars (including Confluence, Notion, Slack tokens)\n\n---\n\n### Advanced\n\n**Purpose:** Specialized topics for power users\n\n**Characteristics:**\n- Assumes basic knowledge\n- Deep dives\n- Complex scenarios\n- Integration topics\n\n**Files:**\n- `mcp-server.md` - MCP server setup\n- `mcp-tools.md` - Advanced MCP usage\n- `custom-workflows.md` - Creating workflows\n- `multi-source.md` - Unified scraping\n\n---\n\n## Naming Conventions\n\n### Files\n\n- **getting-started:** `01-topic.md` (numbered for order)\n- **user-guide:** `01-topic.md` (numbered for order)\n- **reference:** `TOPIC_REFERENCE.md` (uppercase, descriptive)\n- **advanced:** `topic.md` (lowercase, specific)\n\n### Headers\n\n- H1: Title with version\n- H2: Major sections\n- H3: Subsections\n- H4: Details\n\nExample:\n```markdown\n# Topic Guide\n\n> **Skill Seekers v3.9.0**\n\n## Major Section\n\n### Subsection\n\n#### Detail\n```\n\n---\n\n## Cross-References\n\nLink to related docs using relative paths:\n\n```markdown\n<!-- Within same directory -->\nSee [Troubleshooting](user-guide/06-troubleshooting.md)\n\n<!-- Up one directory, then into reference -->\nSee [CLI Reference](reference/CLI_REFERENCE.md)\n\n<!-- Up two directories (to root) -->\nSee [Contributing](../CONTRIBUTING.md)\n```\n\n---\n\n## Maintenance\n\n### Keeping Docs Current\n\n1. **Update with code changes** - Docs must match implementation\n2. **Version in header** - Keep version current\n3. **Last updated date** - Track freshness\n4. **Deprecate old files** - Don't delete, redirect\n\n### Review Checklist\n\nBefore committing docs:\n\n- [ ] Commands actually work (tested)\n- [ ] No phantom commands documented\n- [ ] Links work\n- [ ] Version number correct\n- [ ] Date updated\n\n---\n\n## Adding New Documentation\n\n### New User Guide\n\n1. Add to `user-guide/` with next number\n2. Update `docs/README.md` navigation\n3. Add to table of contents\n4. Link from related guides\n\n### New Reference\n\n1. Add to `reference/` with `_REFERENCE` suffix\n2. Update `docs/README.md` navigation\n3. Link from user guides\n4. Add to troubleshooting if relevant\n\n### New Advanced Topic\n\n1. Add to `advanced/` with descriptive name\n2. Update `docs/README.md` navigation\n3. Link from appropriate user guide\n\n---\n\n## Deprecation Strategy\n\nWhen content becomes outdated:\n\n1. **Don't delete immediately** - Breaks external links\n2. **Add deprecation notice**:\n   ```markdown\n   > ⚠️ **DEPRECATED**: This document is outdated.\n   > See [New Guide](path/to/new.md) for current information.\n   ```\n3. **Move to archive** after 6 months:\n   ```\n   docs/archive/legacy/\n   ```\n4. **Update navigation** to remove deprecated links\n\n---\n\n## Contributing\n\n### Doc Changes\n\n1. Edit relevant file\n2. Test all commands\n3. Update version/date\n4. Submit PR\n\n### New Doc\n\n1. Choose appropriate category\n2. Follow naming conventions\n3. Add to README.md\n4. Cross-link related docs\n\n---\n\n## See Also\n\n- [Docs README](README.md) - Navigation hub\n- [Contributing Guide](../CONTRIBUTING.md) - How to contribute\n- [Repository README](../README.md) - Project overview\n","docs/agents/plans/2026-03-14-epub-input-support.md":"---\ndate: 2026-03-14T19:30:35.172407+00:00\ngit_commit: 7c90a4b9c9bccac8341b0769550d77aae3b4e524\nbranch: development\ntopic: \"Add EPUB Input Support\"\ntags: [plan, epub, scraper, input-format]\nstatus: complete\n---\n\n> 🗄️ **Historical — completed** — This plan was fully executed. EPUB input support is live in Skill Seekers v3.6.0 (`epub_scraper.py`, `arguments/epub.py`, `parsers/epub_parser.py`, 107+ tests).\n\n# Add EPUB Input Support — Implementation Plan\n\n## Overview\n\nAdd `.epub` as an input format for Skill Seekers, enabling `skill-seekers create book.epub` and `skill-seekers epub --epub book.epub`. Follows the established Word/PDF scraper pattern: source detection → routing → extraction → categorize → build skill.\n\n**Authoritative reference**: [W3C EPUB 3.3 Specification](https://www.w3.org/TR/epub-33/) (also covers EPUB 2 backward compatibility).\n\n## Current State Analysis\n\nThe codebase has a consistent multi-layer architecture for document input formats. PDF and Word (.docx) serve as direct analogs. The Word scraper (`word_scraper.py`) is the closest pattern match since both Word and EPUB produce HTML/XHTML that is parsed with BeautifulSoup.\n\n### Key Discoveries:\n- Word scraper converts `.docx` → HTML (via mammoth) → BeautifulSoup parse → intermediate JSON → SKILL.md (`word_scraper.py:96-235`)\n- EPUB files contain XHTML natively (per W3C spec §5), so the mammoth conversion step is unnecessary — BeautifulSoup can parse EPUB XHTML content directly\n- Source detection uses file extension matching (`source_detector.py:57-65`)\n- Optional dependencies use a guard pattern with `try/except ImportError` and a `_check_*_deps()` function (`word_scraper.py:21-40`)\n- The `ebooklib` library (v0.18+) provides `epub.read_epub()` returning an `EpubBook` with spine iteration, metadata access via `get_metadata('DC', key)`, and item content via `get_content()`/`get_body_content()`\n- ebooklib has a known bug: EPUB 3 files read TOC from NCX instead of NAV (issue #200); workaround: `options={\"ignore_ncx\": True}`\n- ebooklib loads entire EPUB into memory — acceptable for typical books but relevant for edge cases\n\n## Desired End State\n\nRunning `skill-seekers create book.epub` produces:\n```\noutput/book/\n├── SKILL.md              # Main skill file with metadata, concepts, code examples\n├── references/\n│   ├── index.md          # Category index with statistics\n│   └── book.md           # Chapter content (or multiple files if categorized)\n├── scripts/\n└── assets/\n    └── *.png|*.jpg       # Extracted images\n```\n\n### CLI Output Mockup\n\n```\n$ skill-seekers create programming-rust.epub\n\nℹ️  Detected source type: epub\nℹ️  Routing to epub scraper...\n\n🔍 Extracting from EPUB: programming-rust.epub\n   Title: Programming Rust, 2nd Edition\n   Author: Jim Blandy, Jason Orendorff\n   Language: en\n   Chapters: 23 (spine items)\n\n📄 Processing chapters...\n   Chapter 1/23: Why Rust? (2 sections, 1 code block)\n   Chapter 2/23: A Tour of Rust (5 sections, 12 code blocks)\n   ...\n   Chapter 23/23: Macros (4 sections, 8 code blocks)\n\n📊 Extraction complete:\n   Sections: 142\n   Code blocks: 287 (Rust: 245, Shell: 28, TOML: 14)\n   Images: 34\n   Tables: 12\n\n💾 Saved extracted data to: output/programming-rust_extracted.json\n\n📋 Categorizing content...\n✅ Created 1 category (single EPUB source)\n   - programming-rust: 142 sections\n\n📝 Generating reference files...\n   Generated: output/programming-rust/references/programming-rust.md\n   Generated: output/programming-rust/references/index.md\n\n✅ Skill built successfully: output/programming-rust/\n\n📦 Next step: Package with: skill-seekers package output/programming-rust/\n```\n\n### Verification:\n- [x] `skill-seekers create book.epub` produces valid output directory\n- [x] `skill-seekers create book.epub --name mybook` works standalone\n- [x] `skill-seekers create book.epub --dry-run` shows config without processing\n- [x] All ~2,540+ existing tests still pass (982 passed, 1 pre-existing failure)\n- [x] New test suite has 100+ tests covering happy path, errors, and edge cases (107 tests, 14 classes)\n\n## What We're NOT Doing\n\n- DRM decryption (detect and error gracefully with clear message)\n- EPUB writing/creation (read-only)\n- Media overlay / audio / video extraction (ignore gracefully)\n- Fixed-layout OCR (detect and warn; extract whatever text exists in XHTML)\n- `--chapter-range` flag (can be added later)\n- Unified scraper (`unified_scraper.py`) EPUB support (separate future task)\n- MCP tool for EPUB (separate future task)\n\n## Implementation Approach\n\nFollow the Word scraper pattern exactly, with EPUB-specific extraction logic:\n\n1. **Phase 1**: Core `epub_scraper.py` — the `EpubToSkillConverter` class\n2. **Phase 2**: CLI integration — source detection, arguments, parser, routing, entry points\n3. **Phase 3**: Comprehensive test suite — 100+ tests across 11 test classes\n4. **Phase 4**: Documentation updates\n\n---\n\n## Phase 1: Core EPUB Scraper\n\n### Overview\nCreate `epub_scraper.py` with `EpubToSkillConverter` class following the Word scraper pattern. This is the bulk of new code.\n\n### Changes Required:\n\n#### [x] 1. Optional dependency in pyproject.toml\n**File**: `pyproject.toml`\n**Changes**: Add `epub` optional dependency group and include in `all` group\n\n```toml\n# After the docx group (~line 115)\n# EPUB (.epub) support\nepub = [\n    \"ebooklib>=0.18\",\n]\n```\n\nAdd `\"ebooklib>=0.18\",` to the `all` group (~line 178).\n\n#### [x] 2. Create `src/skill_seekers/cli/epub_scraper.py`\n**File**: `src/skill_seekers/cli/epub_scraper.py` (new)\n**Changes**: Full EPUB scraper module\n\n**Structure** (following `word_scraper.py` pattern):\n\n```python\n\"\"\"\nEPUB Documentation to Skill Converter\n\nConverts EPUB e-books into skills.\nUses ebooklib for EPUB parsing, BeautifulSoup for XHTML content extraction.\n\nUsage:\n    skill-seekers create book.epub --name myskill\n    skill-seekers create book_extracted.json\n\"\"\"\n\nimport argparse\nimport json\nimport logging\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n# Optional dependency guard\ntry:\n    import ebooklib\n    from ebooklib import epub\n    EPUB_AVAILABLE = True\nexcept ImportError:\n    EPUB_AVAILABLE = False\n\n# BeautifulSoup is a core dependency (always available)\nfrom bs4 import BeautifulSoup, Comment\n\nlogger = logging.getLogger(__name__)\n\n\ndef _check_epub_deps():\n    \"\"\"Raise RuntimeError if ebooklib is not installed.\"\"\"\n    if not EPUB_AVAILABLE:\n        raise RuntimeError(\n            \"ebooklib is required for EPUB support.\\n\"\n            'Install with: pip install \"skill-seekers[epub]\"\\n'\n            \"Or: pip install ebooklib\"\n        )\n\n\ndef infer_description_from_epub(metadata: dict | None = None, name: str = \"\") -> str:\n    \"\"\"Infer skill description from EPUB metadata.\"\"\"\n    if metadata:\n        if metadata.get(\"description\") and len(metadata[\"description\"]) > 20:\n            desc = metadata[\"description\"].strip()\n            if len(desc) > 150:\n                desc = desc[:147] + \"...\"\n            return f\"Use when {desc.lower()}\"\n        if metadata.get(\"title\") and len(metadata[\"title\"]) > 10:\n            return f\"Use when working with {metadata['title'].lower()}\"\n    return (\n        f\"Use when referencing {name} documentation\"\n        if name\n        else \"Use when referencing this documentation\"\n    )\n```\n\n**`EpubToSkillConverter` class methods:**\n\n```python\nclass EpubToSkillConverter:\n    def __init__(self, config: dict):\n        self.config = config\n        self.name = config[\"name\"]\n        self.epub_path = config.get(\"epub_path\", \"\")\n        self.description = config.get(\n            \"description\", f\"Use when referencing {self.name} documentation\"\n        )\n        self.skill_dir = f\"output/{self.name}\"\n        self.data_file = f\"output/{self.name}_extracted.json\"\n        self.categories = config.get(\"categories\", {})\n        self.extracted_data = None\n\n    def extract_epub(self) -> bool:\n        \"\"\"Extract content from EPUB file.\n\n        Workflow:\n        1. Check dependencies (ebooklib)\n        2. Detect DRM via META-INF/encryption.xml (fail fast)\n        3. Read EPUB via ebooklib with ignore_ncx=True (EPUB 3 TOC bug workaround)\n        4. Extract Dublin Core metadata (title, creator, language, publisher, date, description, subject)\n        5. Iterate spine items in reading order\n        6. For each ITEM_DOCUMENT: parse XHTML with BeautifulSoup\n        7. Split by h1/h2 heading boundaries into sections\n        8. Extract code blocks from <pre>/<code> elements\n        9. Extract images from EpubImage items\n        10. Detect code languages via LanguageDetector\n        11. Save intermediate JSON to {name}_extracted.json\n\n        Returns True on success.\n        Raises RuntimeError for DRM-protected files.\n        Raises FileNotFoundError for missing files.\n        Raises ValueError for invalid EPUB files.\n        \"\"\"\n```\n\n**DRM detection** (per W3C spec §4.2.6.3.2):\n\n```python\ndef _detect_drm(self, book) -> bool:\n    \"\"\"Detect DRM by checking for encryption.xml with non-font-obfuscation entries.\n\n    Per W3C EPUB 3.3 spec: encryption.xml is present when resources are encrypted.\n    Font obfuscation (IDPF algorithm http://www.idpf.org/2008/embedding or\n    Adobe algorithm http://ns.adobe.com/pdf/enc#RC) is NOT DRM — only font mangling.\n\n    Actual DRM uses algorithms like:\n    - Adobe ADEPT: http://ns.adobe.com/adept namespace\n    - Apple FairPlay: http://itunes.apple.com/dataenc\n    - Readium LCP: http://readium.org/2014/01/lcp\n    \"\"\"\n```\n\n**Metadata extraction** (per W3C spec §5.2, Dublin Core):\n\n```python\ndef _extract_metadata(self, book) -> dict:\n    \"\"\"Extract Dublin Core metadata from EPUB.\n\n    Per W3C EPUB 3.3 spec: required elements are dc:identifier, dc:title, dc:language.\n    Optional: dc:creator, dc:contributor, dc:date, dc:description, dc:publisher,\n    dc:subject, dc:rights, dc:type, dc:coverage, dc:source, dc:relation, dc:format.\n\n    ebooklib API: book.get_metadata('DC', key) returns list of (value, attrs) tuples.\n    \"\"\"\n    def _get_one(key):\n        data = book.get_metadata('DC', key)\n        return data[0][0] if data else None\n\n    def _get_list(key):\n        data = book.get_metadata('DC', key)\n        return [x[0] for x in data] if data else []\n\n    return {\n        \"title\": _get_one('title') or \"Untitled\",\n        \"author\": \", \".join(_get_list('creator')) or None,\n        \"language\": _get_one('language') or \"en\",\n        \"publisher\": _get_one('publisher'),\n        \"date\": _get_one('date'),\n        \"description\": _get_one('description'),\n        \"subject\": \", \".join(_get_list('subject')) or None,\n        \"rights\": _get_one('rights'),\n        \"identifier\": _get_one('identifier'),\n    }\n```\n\n**Content extraction** (per W3C spec §5 — XHTML Content Documents use XML serialization of HTML5):\n\n```python\ndef _extract_spine_content(self, book) -> list[dict]:\n    \"\"\"Extract content from spine items in reading order.\n\n    Per W3C EPUB 3.3 spec §3.4.8: spine defines ordered list of content documents.\n    Linear=\"yes\" (default) items form the primary reading order.\n    Linear=\"no\" items are auxiliary (footnotes, glossary).\n\n    Per spec §5: XHTML content documents use XML syntax of HTML5.\n    Parse with BeautifulSoup, split by h1/h2 heading boundaries.\n    \"\"\"\n    sections = []\n    section_number = 0\n\n    for item_id, linear in book.spine:\n        item = book.get_item_with_id(item_id)\n        if not item or item.get_type() != ebooklib.ITEM_DOCUMENT:\n            continue\n\n        soup = BeautifulSoup(item.get_content(), 'html.parser')\n\n        # Remove scripts, styles, comments (not useful for text extraction)\n        for tag in soup(['script', 'style']):\n            tag.decompose()\n        for comment in soup.find_all(string=lambda t: isinstance(t, Comment)):\n            comment.extract()\n\n        body = soup.find('body')\n        if not body:\n            continue\n\n        # Split by h1/h2 heading boundaries (same as word_scraper)\n        # Each heading starts a new section\n        ...\n```\n\n**Image extraction** (per W3C spec §3.3 — core media types include JPEG, PNG, GIF, WebP, SVG):\n\n```python\ndef _extract_images(self, book) -> list[dict]:\n    \"\"\"Extract images from EPUB manifest.\n\n    Per W3C EPUB 3.3 spec §3.3: core image media types are\n    image/gif, image/jpeg, image/png, image/svg+xml, image/webp.\n\n    ebooklib API: book.get_items_of_type(ebooklib.ITEM_IMAGE)\n    returns EpubImage items with get_content() (bytes) and media_type.\n\n    SVG images (ITEM_VECTOR) handled separately.\n    \"\"\"\n```\n\n**The remaining methods** (`categorize_content`, `build_skill`, `_generate_reference_file`, `_generate_index`, `_generate_skill_md`, `_format_key_concepts`, `_format_patterns_from_content`, `_sanitize_filename`) follow the Word scraper pattern exactly — they operate on the same intermediate JSON structure.\n\n**`main()` function** (following `word_scraper.py:923-1059`):\n\n```python\ndef main():\n    from .arguments.epub import add_epub_arguments\n\n    parser = argparse.ArgumentParser(\n        description=\"Convert EPUB e-book to skill\",\n        formatter_class=argparse.RawDescriptionHelpFormatter,\n    )\n    add_epub_arguments(parser)\n    args = parser.parse_args()\n\n    # Logging setup\n    if getattr(args, \"quiet\", False):\n        logging.getLogger().setLevel(logging.WARNING)\n    elif getattr(args, \"verbose\", False):\n        logging.getLogger().setLevel(logging.DEBUG)\n\n    # Dry run\n    if getattr(args, \"dry_run\", False):\n        source = args.epub or args.from_json or \"(none)\"\n        print(f\"\\n{'=' * 60}\")\n        print(\"DRY RUN: EPUB Extraction\")\n        print(f\"{'=' * 60}\")\n        print(f\"Source:         {source}\")\n        print(f\"Name:           {getattr(args, 'name', None) or '(auto-detect)'}\")\n        print(f\"Enhance level:  {getattr(args, 'enhance_level', 0)}\")\n        print(f\"\\n✅ Dry run complete\")\n        return\n\n    # Validate inputs\n    if not (args.epub or args.from_json):\n        parser.error(\"Must specify --epub or --from-json\")\n\n    # From-JSON workflow\n    if args.from_json:\n        name = Path(args.from_json).stem.replace(\"_extracted\", \"\")\n        config = {\n            \"name\": name,\n            \"description\": args.description or f\"Use when referencing {name} documentation\",\n        }\n        converter = EpubToSkillConverter(config)\n        converter.load_extracted_data(args.from_json)\n        converter.build_skill()\n        return\n\n    # Direct EPUB workflow\n    name = args.name or Path(args.epub).stem\n    config = {\n        \"name\": name,\n        \"epub_path\": args.epub,\n        \"description\": args.description or f\"Use when referencing {name} documentation\",\n    }\n\n    try:\n        converter = EpubToSkillConverter(config)\n        if not converter.extract_epub():\n            print(\"\\n❌ EPUB extraction failed\", file=sys.stderr)\n            sys.exit(1)\n        converter.build_skill()\n\n        # Enhancement workflow integration\n        from skill_seekers.cli.workflow_runner import run_workflows\n        run_workflows(args)\n\n        # Traditional enhancement\n        if getattr(args, \"enhance_level\", 0) > 0:\n            # Same pattern as word_scraper.py and pdf_scraper.py\n            ...\n\n    except RuntimeError as e:\n        print(f\"\\n❌ Error: {e}\", file=sys.stderr)\n        sys.exit(1)\n```\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `ruff check src/skill_seekers/cli/epub_scraper.py` passes\n- [x] `ruff format --check src/skill_seekers/cli/epub_scraper.py` passes\n- [ ] `mypy src/skill_seekers/cli/epub_scraper.py` passes (continue-on-error)\n- [x] `pip install -e \".[epub]\"` installs successfully\n\n#### Manual Verification:\n- [x] Verify `import ebooklib` works after install\n- [x] Review epub_scraper.py structure matches word_scraper.py pattern\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding to the next phase.\n\n---\n\n## Phase 2: CLI Integration\n\n### Overview\nWire the EPUB scraper into the CLI: source detection, argument definitions, parser registration, create command routing, and entry points.\n\n### Changes Required:\n\n#### [x] 1. Source detection\n**File**: `src/skill_seekers/cli/source_detector.py`\n**Changes**: Add `.epub` extension detection, `_detect_epub()` method, validation, and error message update\n\nAdd after the `.docx` check (line 64):\n```python\nif source.endswith(\".epub\"):\n    return cls._detect_epub(source)\n```\n\nAdd `_detect_epub()` method (following `_detect_word()` at line 124):\n```python\n@classmethod\ndef _detect_epub(cls, source: str) -> SourceInfo:\n    \"\"\"Detect EPUB file source.\"\"\"\n    name = os.path.splitext(os.path.basename(source))[0]\n    return SourceInfo(\n        type=\"epub\", parsed={\"file_path\": source}, suggested_name=name, raw_input=source\n    )\n```\n\nAdd epub validation in `validate_source()` (after word block at line 278):\n```python\nelif source_info.type == \"epub\":\n    file_path = source_info.parsed[\"file_path\"]\n    if not os.path.exists(file_path):\n        raise ValueError(f\"EPUB file does not exist: {file_path}\")\n    if not os.path.isfile(file_path):\n        raise ValueError(f\"Path is not a file: {file_path}\")\n```\n\nAdd EPUB example to the ValueError message (line 94):\n```python\n\"  EPUB:  skill-seekers create ebook.epub\\n\"\n```\n\n#### [x] 2. Argument definitions\n**File**: `src/skill_seekers/cli/arguments/epub.py` (new)\n**Changes**: EPUB-specific argument definitions\n\n```python\n\"\"\"EPUB-specific CLI arguments.\"\"\"\n\nimport argparse\nfrom typing import Any\n\nfrom .common import add_all_standard_arguments\n\nEPUB_ARGUMENTS: dict[str, dict[str, Any]] = {\n    \"epub\": {\n        \"flags\": (\"--epub\",),\n        \"kwargs\": {\n            \"type\": str,\n            \"help\": \"Direct EPUB file path\",\n            \"metavar\": \"PATH\",\n        },\n    },\n    \"from_json\": {\n        \"flags\": (\"--from-json\",),\n        \"kwargs\": {\n            \"type\": str,\n            \"help\": \"Build skill from extracted JSON\",\n            \"metavar\": \"FILE\",\n        },\n    },\n}\n\n\ndef add_epub_arguments(parser: argparse.ArgumentParser) -> None:\n    \"\"\"Add EPUB-specific arguments to parser.\"\"\"\n    add_all_standard_arguments(parser)\n\n    # Override enhance-level default to 0 for EPUB\n    for action in parser._actions:\n        if hasattr(action, \"dest\") and action.dest == \"enhance_level\":\n            action.default = 0\n            action.help = (\n                \"AI enhancement level (auto-detects API vs LOCAL mode): \"\n                \"0=disabled (default for EPUB), 1=SKILL.md only, \"\n                \"2=+architecture/config, 3=full enhancement. \"\n                \"Mode selection: uses API if ANTHROPIC_API_KEY is set, \"\n                \"otherwise LOCAL (Claude Code)\"\n            )\n\n    for arg_name, arg_def in EPUB_ARGUMENTS.items():\n        parser.add_argument(*arg_def[\"flags\"], **arg_def[\"kwargs\"])\n```\n\n#### [x] 3. Create command argument integration\n**File**: `src/skill_seekers/cli/arguments/create.py`\n**Changes**: Add EPUB_ARGUMENTS dict, register in helper functions, add mode handling\n\nAdd after WORD_ARGUMENTS (~line 411):\n```python\n# EPUB specific (from epub.py)\nEPUB_ARGUMENTS: dict[str, dict[str, Any]] = {\n    \"epub\": {\n        \"flags\": (\"--epub\",),\n        \"kwargs\": {\n            \"type\": str,\n            \"help\": \"EPUB file path\",\n            \"metavar\": \"PATH\",\n        },\n    },\n}\n```\n\nAdd to `get_source_specific_arguments()` (line 595):\n```python\n\"epub\": EPUB_ARGUMENTS,\n```\n\nAdd to `add_create_arguments()` (after word block at line 678):\n```python\nif mode in [\"epub\", \"all\"]:\n    for arg_name, arg_def in EPUB_ARGUMENTS.items():\n        parser.add_argument(*arg_def[\"flags\"], **arg_def[\"kwargs\"])\n```\n\n#### [x] 4. Parser class\n**File**: `src/skill_seekers/cli/parsers/epub_parser.py` (new)\n**Changes**: Subcommand parser for standalone `skill-seekers epub` command\n\n```python\n\"\"\"Parser for epub subcommand.\"\"\"\n\nfrom .base import SubcommandParser\nfrom skill_seekers.cli.arguments.epub import add_epub_arguments\n\n\nclass EpubParser(SubcommandParser):\n    \"\"\"Parser for EPUB extraction command.\"\"\"\n\n    @property\n    def name(self) -> str:\n        return \"epub\"\n\n    @property\n    def help(self) -> str:\n        return \"Extract from EPUB e-book (.epub)\"\n\n    @property\n    def description(self) -> str:\n        return \"Extract content from EPUB e-book (.epub) and generate skill\"\n\n    def add_arguments(self, parser):\n        add_epub_arguments(parser)\n```\n\n#### [x] 5. Parser registration\n**File**: `src/skill_seekers/cli/parsers/__init__.py`\n**Changes**: Import and register EpubParser\n\nAdd import (after WordParser import, line 15):\n```python\nfrom .epub_parser import EpubParser\n```\n\nAdd to PARSERS list (after `WordParser()`, line 46):\n```python\nEpubParser(),\n```\n\n#### [x] 6. CLI dispatcher\n**File**: `src/skill_seekers/cli/main.py`\n**Changes**: Add epub to COMMAND_MODULES dict and module docstring\n\nAdd to COMMAND_MODULES (after \"word\" entry, line 52):\n```python\n\"epub\": \"skill_seekers.cli.epub_scraper\",\n```\n\nAdd to module docstring (after \"word\" line, line 15):\n```python\n#    epub                 Extract from EPUB e-book (.epub)\n```\n\n#### [x] 7. Create command routing\n**File**: `src/skill_seekers/cli/create_command.py`\n**Changes**: Add `_route_epub()` method, routing case, help flag, and epilog example\n\nAdd to `_route_to_scraper()` (after word case, line 136):\n```python\nelif self.source_info.type == \"epub\":\n    return self._route_epub()\n```\n\nAdd `_route_epub()` method (after `_route_word()`, line 352):\n```python\ndef _route_epub(self) -> int:\n    \"\"\"Route to EPUB scraper (epub_scraper.py).\"\"\"\n    from skill_seekers.cli import epub_scraper\n\n    argv = [\"epub_scraper\"]\n    file_path = self.source_info.parsed[\"file_path\"]\n    argv.extend([\"--epub\", file_path])\n    self._add_common_args(argv)\n\n    logger.debug(f\"Calling epub_scraper with argv: {argv}\")\n    original_argv = sys.argv\n    try:\n        sys.argv = argv\n        return epub_scraper.main()\n    finally:\n        sys.argv = original_argv\n```\n\nAdd to epilog (line 543, after DOCX example):\n```python\n  EPUB:     skill-seekers create ebook.epub\n```\n\nAdd to Source Auto-Detection section:\n```python\n  • file.epub → EPUB extraction\n```\n\nAdd `--help-epub` flag and handler (after `--help-word` at line 592):\n```python\nparser.add_argument(\n    \"--help-epub\", action=\"store_true\", help=argparse.SUPPRESS, dest=\"_help_epub\"\n)\n```\n\nAdd handler block (after `_help_word` block at line 654):\n```python\nelif args._help_epub:\n    parser_epub = argparse.ArgumentParser(\n        prog=\"skill-seekers create\",\n        description=\"Create skill from EPUB e-book (.epub)\",\n        formatter_class=argparse.RawDescriptionHelpFormatter,\n    )\n    add_create_arguments(parser_epub, mode=\"epub\")\n    parser_epub.print_help()\n    return 0\n```\n\n#### [x] 8. Entry point\n**File**: `pyproject.toml`\n**Changes**: Add standalone entry point\n\nAdd after `skill-seekers-word` (line 224):\n```toml\nskill-seekers-epub = \"skill_seekers.cli.epub_scraper:main\"\n```\n\n#### [x] 9. Positional argument handling in main.py\n**File**: `src/skill_seekers/cli/main.py`\n**Changes**: Add \"input_file\" is already in the positional list at line 153, so no change needed. Verify `_reconstruct_argv` handles epub correctly through the standard delegation path.\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `ruff check src/skill_seekers/cli/source_detector.py src/skill_seekers/cli/arguments/epub.py src/skill_seekers/cli/parsers/epub_parser.py src/skill_seekers/cli/create_command.py` passes\n- [x] `ruff format --check src/skill_seekers/cli/` passes\n- [x] `pip install -e \".[epub]\"` installs with all entry points\n- [x] `skill-seekers create --help` shows EPUB-specific help\n- [x] `skill-seekers create --help-epub` shows EPUB arguments (via standalone entry point `skill-seekers-create`)\n- [x] `skill-seekers create nonexistent.epub` gives clear error about missing file\n- [x] Existing tests still pass: `pytest tests/ -v -x -m \"not slow and not integration\"` (875 passed, 1 pre-existing unrelated failure in test_git_sources_e2e)\n\n#### Manual Verification:\n- [x] `skill-seekers --help` lists `epub` command\n- [x] `skill-seekers create book.epub --dry-run` shows dry run output\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding to the next phase.\n\n---\n\n## Phase 3: Comprehensive Test Suite\n\n### Overview\nCreate `tests/test_epub_scraper.py` with 100+ tests across 11 test classes, covering happy path, negative cases, edge cases, and CLI integration.\n\n### Changes Required:\n\n#### [x] 1. Create test file\n**File**: `tests/test_epub_scraper.py` (new)\n**Changes**: Comprehensive test suite following `test_word_scraper.py` patterns\n\n```python\n\"\"\"\nTests for EPUB scraper (epub_scraper.py).\n\nCovers: initialization, extraction, categorization, skill building,\ncode blocks, tables, images, error handling, JSON workflow, CLI arguments,\nhelper functions, source detection, DRM detection, and edge cases.\n\nTests use mock data and do not require actual EPUB files or ebooklib installed.\n\"\"\"\n\nimport json\nimport os\nimport shutil\nimport tempfile\nimport unittest\nfrom pathlib import Path\nfrom unittest.mock import MagicMock, patch, PropertyMock\n\n\n# Conditional import (same pattern as test_word_scraper.py)\ntry:\n    from skill_seekers.cli.epub_scraper import (\n        EpubToSkillConverter,\n        infer_description_from_epub,\n        _score_code_quality,\n        _check_epub_deps,\n        EPUB_AVAILABLE,\n    )\n    IMPORT_OK = True\nexcept ImportError:\n    IMPORT_OK = False\n```\n\n**Helper factory function:**\n\n```python\ndef _make_sample_extracted_data(\n    num_sections=2,\n    include_code=False,\n    include_tables=False,\n    include_images=False,\n) -> dict:\n    \"\"\"Create minimal extracted_data dict for testing.\"\"\"\n    sections = []\n    total_code = 0\n    total_images = 0\n    languages = {}\n\n    for i in range(1, num_sections + 1):\n        section = {\n            \"section_number\": i,\n            \"heading\": f\"Chapter {i}\",\n            \"heading_level\": \"h1\",\n            \"text\": f\"Content of chapter {i}. This is sample text.\",\n            \"headings\": [{\"level\": \"h2\", \"text\": f\"Section {i}.1\"}],\n            \"code_samples\": [],\n            \"tables\": [],\n            \"images\": [],\n        }\n\n        if include_code:\n            section[\"code_samples\"] = [\n                {\"code\": f\"def func_{i}():\\n    return {i}\", \"language\": \"python\", \"quality_score\": 7.5},\n                {\"code\": f\"console.log({i})\", \"language\": \"javascript\", \"quality_score\": 4.0},\n            ]\n            total_code += 2\n            languages[\"python\"] = languages.get(\"python\", 0) + 1\n            languages[\"javascript\"] = languages.get(\"javascript\", 0) + 1\n\n        if include_tables:\n            section[\"tables\"] = [\n                {\"headers\": [\"Name\", \"Value\"], \"rows\": [[\"key\", \"val\"]]}\n            ]\n\n        if include_images:\n            section[\"images\"] = [\n                {\"index\": 1, \"data\": b\"\\x89PNG\\r\\n\\x1a\\n\", \"width\": 100, \"height\": 100}\n            ]\n            total_images += 1\n\n        sections.append(section)\n\n    return {\n        \"source_file\": \"test.epub\",\n        \"metadata\": {\n            \"title\": \"Test Book\",\n            \"author\": \"Test Author\",\n            \"language\": \"en\",\n            \"publisher\": \"Test Publisher\",\n            \"date\": \"2024-01-01\",\n            \"description\": \"A test book for unit testing\",\n            \"subject\": \"Testing, Unit Tests\",\n            \"rights\": \"Copyright 2024\",\n            \"identifier\": \"urn:uuid:12345\",\n        },\n        \"total_sections\": num_sections,\n        \"total_code_blocks\": total_code,\n        \"total_images\": total_images,\n        \"languages_detected\": languages,\n        \"pages\": sections,\n    }\n```\n\n### Test Classes and Methods:\n\n#### [x] Class 1: `TestEpubToSkillConverterInit` (8 tests)\n\n**Happy path:**\n- `test_init_with_name_and_epub_path` — basic config with name + epub_path\n- `test_init_with_full_config` — config with all fields (name, epub_path, description, categories)\n- `test_default_description_uses_name` — description defaults to \"Use when referencing {name} documentation\"\n- `test_skill_dir_uses_name` — skill_dir is `output/{name}`\n- `test_data_file_uses_name` — data_file is `output/{name}_extracted.json`\n\n**Negative:**\n- `test_init_requires_name` — missing \"name\" key raises KeyError\n- `test_init_empty_name` — empty string name still works (no crash)\n\n**Edge case:**\n- `test_init_with_special_characters_in_name` — name with spaces/dashes sanitized for paths\n\n#### [x] Class 2: `TestEpubExtraction` (12 tests)\n\n**Happy path:**\n- `test_extract_basic_epub` — mock ebooklib, verify sections extracted in spine order\n- `test_extract_metadata` — verify Dublin Core metadata extraction (title, creator, language, etc.)\n- `test_extract_multiple_chapters` — multiple spine items produce multiple sections\n- `test_extract_code_blocks` — `<pre><code>` elements extracted with language detection\n- `test_extract_images` — ITEM_IMAGE items extracted with correct content\n- `test_heading_boundary_splitting` — h1/h2 boundaries create new sections\n\n**Negative:**\n- `test_extract_missing_file_raises_error` — FileNotFoundError for nonexistent path\n- `test_extract_invalid_epub_raises_error` — ValueError for corrupted/non-EPUB file\n- `test_extract_deps_not_installed` — RuntimeError with install instructions when ebooklib missing\n\n**Edge cases:**\n- `test_extract_empty_spine` — EPUB with no spine items produces empty sections list\n- `test_extract_spine_item_no_body` — XHTML without `<body>` tag skipped gracefully\n- `test_extract_non_linear_spine_items` — linear=\"no\" items still extracted (included but flagged)\n\n#### [x] Class 3: `TestEpubDrmDetection` (6 tests)\n\n**Happy path:**\n- `test_no_drm_detected` — normal EPUB without encryption.xml returns False\n\n**Negative:**\n- `test_drm_detected_adobe_adept` — encryption.xml with Adobe namespace raises RuntimeError\n- `test_drm_detected_apple_fairplay` — encryption.xml with Apple namespace raises RuntimeError\n- `test_drm_detected_readium_lcp` — encryption.xml with Readium namespace raises RuntimeError\n\n**Edge cases:**\n- `test_font_obfuscation_not_drm` — encryption.xml with only IDPF font obfuscation algorithm (`http://www.idpf.org/2008/embedding`) is NOT DRM, extraction proceeds\n- `test_drm_error_message_is_clear` — error message mentions DRM and suggests removing protection\n\n#### [x] Class 4: `TestEpubCategorization` (8 tests)\n\n**Happy path:**\n- `test_single_source_creates_one_category` — single EPUB creates category named after file\n- `test_keyword_categorization` — sections matched to categories by keyword scoring\n- `test_no_categories_uses_default` — no category config creates single \"content\" category\n\n**Negative:**\n- `test_categorize_empty_sections` — empty sections list produces empty categories\n- `test_categorize_no_keyword_matches` — unmatched sections go to \"other\" category\n\n**Edge cases:**\n- `test_categorize_single_section` — one section creates one category\n- `test_categorize_many_sections` — 50+ sections categorized correctly\n- `test_categorize_preserves_section_order` — sections maintain original order within categories\n\n#### [x] Class 5: `TestEpubSkillBuilding` (10 tests)\n\n**Happy path:**\n- `test_build_creates_directory_structure` — output/{name}/, references/, scripts/, assets/ created\n- `test_build_generates_skill_md` — SKILL.md created with YAML frontmatter\n- `test_build_generates_reference_files` — reference markdown files created per category\n- `test_build_generates_index` — references/index.md created with category links\n- `test_skill_md_contains_metadata` — SKILL.md includes title, author, language from metadata\n- `test_skill_md_yaml_frontmatter` — frontmatter has name and description fields\n\n**Negative:**\n- `test_build_without_extracted_data_fails` — calling build_skill() before extraction raises error\n\n**Edge cases:**\n- `test_build_overwrites_existing_output` — re-running build overwrites existing files\n- `test_build_with_long_name` — name > 64 chars truncated in YAML frontmatter\n- `test_build_with_unicode_content` — Unicode text (CJK, Arabic, emoji) preserved correctly\n\n#### [x] Class 6: `TestEpubCodeBlocks` (8 tests)\n\n**Happy path:**\n- `test_code_blocks_included_in_reference_files` — code samples appear in reference markdown\n- `test_code_blocks_in_skill_md_top_15` — SKILL.md shows top 15 code examples by quality\n- `test_code_language_grouped` — code examples grouped by language in SKILL.md\n\n**Edge cases:**\n- `test_empty_code_block` — `<pre><code></code></pre>` with no content skipped\n- `test_code_block_with_html_entities` — `&lt;`, `&gt;`, `&amp;` decoded to `<`, `>`, `&`\n- `test_code_block_with_syntax_highlighting_spans` — `<span class=\"keyword\">` stripped, plain text preserved\n- `test_code_block_language_from_class` — `class=\"language-python\"`, `class=\"code-rust\"` detected\n- `test_code_quality_scoring` — scoring heuristic produces expected ranges (0-10)\n\n#### [x] Class 7: `TestEpubTables` (5 tests)\n\n**Happy path:**\n- `test_tables_in_reference_files` — tables rendered as markdown in reference files\n- `test_table_with_headers` — headers from `<thead>` used correctly\n\n**Edge cases:**\n- `test_table_no_thead` — first row used as headers when no `<thead>`\n- `test_empty_table` — empty `<table>` element handled gracefully\n- `test_table_with_colspan_rowspan` — complex tables don't crash (data may be imperfect)\n\n#### [x] Class 8: `TestEpubImages` (7 tests)\n\n**Happy path:**\n- `test_images_saved_to_assets` — image bytes written to assets/ directory\n- `test_image_references_in_markdown` — markdown `![Image](../assets/...)` references correct\n\n**Negative:**\n- `test_image_with_zero_bytes` — empty image content skipped\n\n**Edge cases:**\n- `test_svg_images_handled` — SVG items (ITEM_VECTOR) extracted or skipped gracefully\n- `test_image_filename_conflicts` — duplicate filenames disambiguated\n- `test_cover_image_identified` — cover image (ITEM_COVER) extracted\n- `test_many_images` — 100+ images extracted without error\n\n#### [x] Class 9: `TestEpubErrorHandling` (10 tests)\n\n**Negative / error cases:**\n- `test_missing_epub_file_raises_error` — FileNotFoundError for nonexistent path\n- `test_not_a_file_raises_error` — ValueError when path is a directory\n- `test_not_epub_extension_raises_error` — ValueError for .txt, .pdf, .doc files\n- `test_corrupted_zip_raises_error` — ValueError or RuntimeError for corrupted ZIP\n- `test_missing_container_xml` — ValueError for ZIP without META-INF/container.xml\n- `test_missing_opf_file` — ValueError when container.xml points to nonexistent OPF\n- `test_drm_protected_raises_error` — RuntimeError with clear DRM message\n- `test_empty_epub_raises_error` — ValueError for EPUB with no content documents\n- `test_ebooklib_not_installed_error` — RuntimeError with install instructions\n- `test_malformed_xhtml_handled_gracefully` — unclosed tags, invalid entities don't crash (BeautifulSoup tolerant parsing)\n\n#### [x] Class 10: `TestEpubJSONWorkflow` (6 tests)\n\n**Happy path:**\n- `test_load_extracted_json` — load previously extracted JSON\n- `test_build_from_json` — full workflow: load JSON → categorize → build\n- `test_json_round_trip` — extract → save JSON → load JSON → build produces same output\n\n**Negative:**\n- `test_load_invalid_json` — malformed JSON raises appropriate error\n- `test_load_nonexistent_json` — FileNotFoundError for missing file\n\n**Edge case:**\n- `test_json_with_missing_fields` — partial JSON (missing optional fields) still works\n\n#### [x] Class 11: `TestEpubCLIArguments` (8 tests)\n\n**Happy path:**\n- `test_epub_flag_accepted` — `--epub path.epub` parsed correctly\n- `test_from_json_flag_accepted` — `--from-json data.json` parsed correctly\n- `test_name_flag_accepted` — `--name mybook` parsed correctly\n- `test_enhance_level_default_zero` — enhance-level defaults to 0 for EPUB\n- `test_dry_run_flag` — `--dry-run` flag parsed correctly\n\n**Negative:**\n- `test_no_args_shows_error` — no `--epub` or `--from-json` shows error\n\n**Integration:**\n- `test_verbose_flag` — `--verbose` accepted\n- `test_quiet_flag` — `--quiet` accepted\n\n#### [x] Class 12: `TestEpubHelperFunctions` (6 tests)\n\n- `test_infer_description_from_metadata_description` — uses description field\n- `test_infer_description_from_metadata_title` — falls back to title\n- `test_infer_description_fallback` — falls back to name-based template\n- `test_infer_description_empty_metadata` — empty dict returns fallback\n- `test_score_code_quality_ranges` — scoring returns 0-10\n- `test_sanitize_filename` — special characters cleaned\n\n#### [x] Class 13: `TestEpubSourceDetection` (6 tests)\n\n- `test_epub_detected_as_epub_type` — `.epub` extension detected correctly\n- `test_epub_suggested_name` — filename stem used as suggested name\n- `test_epub_validation_missing_file` — validation raises ValueError for missing file\n- `test_epub_validation_not_a_file` — validation raises ValueError for directory\n- `test_epub_with_path` — `./books/test.epub` detected with correct file_path\n- `test_pdf_still_detected` — regression test: `.pdf` still detected as pdf type\n\n#### [x] Class 14: `TestEpubEdgeCases` (8 tests)\n\n**Per W3C EPUB 3.3 spec edge cases:**\n- `test_epub2_vs_epub3` — both versions parse successfully (ebooklib handles both)\n- `test_epub_no_toc` — EPUB without table of contents extracts using spine order\n- `test_epub_empty_chapters` — chapters with no text content skipped gracefully\n- `test_epub_single_chapter` — book with one spine item produces valid output\n- `test_epub_unicode_content` — CJK, Arabic, Cyrillic, emoji text preserved\n- `test_epub_large_section_count` — 100+ sections processed without error\n- `test_epub_nested_headings` — h3/h4/h5/h6 become sub-headings within sections\n- `test_fixed_layout_detected` — fixed-layout EPUB produces warning but still extracts text\n\n**Total: ~108 test methods across 14 classes**\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `pytest tests/test_epub_scraper.py -v` — all 107 tests pass\n- [x] `pytest tests/ -v -x -m \"not slow and not integration\"` — 982 passed (1 pre-existing unrelated failure in test_git_sources_e2e)\n- [x] `ruff check tests/test_epub_scraper.py` passes\n- [x] `ruff format --check tests/test_epub_scraper.py` passes\n- [x] Test count >= 100 methods (107 tests across 14 classes)\n\n#### Manual Verification:\n- [x] Review test coverage includes: happy path, negative, edge cases, CLI, source detection, DRM, JSON workflow\n- [x] Verify no tests require actual EPUB files or ebooklib installed (all use mocks/skipTest guards)\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding to the next phase.\n\n---\n\n## Phase 4: Documentation\n\n### Overview\nUpdate CLAUDE.md and CHANGELOG.md to reflect the new EPUB support.\n\n### Changes Required:\n\n#### [x] 1. Update CLAUDE.md\n**File**: `CLAUDE.md`\n**Changes**:\n\nAdd to Commands section (after pdf line):\n```\nskill-seekers create book.epub --name myskill\n```\n\nAdd to \"Unified create\" examples:\n```\nskill-seekers create book.epub\n```\n\nAdd to Key source files table:\n```\n| Core scraping | `cli/epub_scraper.py` |\n```\n\nAdd to \"Adding things → New create command flags\" section:\n```\n- Source-specific → `EPUB_ARGUMENTS`\n```\n\n#### [x] 2. Update CHANGELOG.md\n**File**: `CHANGELOG.md`\n**Changes**: Add entry for EPUB support under next version\n\n```markdown\n### Added\n- EPUB (.epub) input support via `skill-seekers create book.epub` or `skill-seekers epub --epub book.epub`\n- Extracts chapters, metadata, code blocks, images, and tables from EPUB 2 and EPUB 3 files\n- DRM detection with clear error messages\n- Optional dependency: `pip install \"skill-seekers[epub]\"`\n```\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `ruff check` passes on any modified files\n- [x] `pytest tests/ -v -x -m \"not slow and not integration\"` — all tests still pass (982 passed, 1 pre-existing failure)\n\n#### Manual Verification:\n- [x] CLAUDE.md accurately reflects new commands\n- [x] CHANGELOG.md entry is clear and complete\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding.\n\n---\n\n## Testing Strategy\n\n### Unit Tests (Phase 3 — ~108 tests):\n\n**By category:**\n| Category | Count | What's tested |\n|----------|-------|---------------|\n| Initialization | 8 | Config parsing, defaults, edge cases |\n| Extraction | 12 | Spine iteration, metadata, headings, code, images |\n| DRM detection | 6 | Adobe, Apple, Readium, font obfuscation (not DRM) |\n| Categorization | 8 | Single/multi category, keywords, empty, ordering |\n| Skill building | 10 | Directory structure, SKILL.md, references, index |\n| Code blocks | 8 | Extraction, quality, language detection, HTML entities |\n| Tables | 5 | Headers, no-thead fallback, empty, colspan |\n| Images | 7 | Save, references, SVG, conflicts, cover, many |\n| Error handling | 10 | Missing file, corrupt, DRM, no deps, malformed XHTML |\n| JSON workflow | 6 | Load, build, round-trip, invalid, missing fields |\n| CLI arguments | 8 | Flags, defaults, dry-run, verbose/quiet |\n| Helper functions | 6 | Description inference, quality scoring, filename sanitization |\n| Source detection | 6 | Detection, validation, regression |\n| Edge cases | 8 | EPUB 2/3, no TOC, empty chapters, Unicode, fixed-layout |\n\n### Integration Tests:\n- Full extract → categorize → build workflow with mock ebooklib\n- JSON round-trip (extract → save → load → build)\n\n### Manual Testing Steps:\n1. `pip install -e \".[epub]\"` — verify install\n2. `skill-seekers create book.epub` with a real EPUB file — verify output directory structure\n3. `skill-seekers create book.epub --dry-run` — verify dry run output\n4. `skill-seekers create drm-book.epub` — verify DRM error message\n5. `skill-seekers create nonexistent.epub` — verify file-not-found error\n6. Open generated `SKILL.md` — verify content quality and structure\n\n## Performance Considerations\n\n- ebooklib loads entire EPUB into memory. For typical books (<50MB), this is fine\n- For very large EPUBs (100MB+), memory usage may spike. No mitigation needed for v1 — document as known limitation\n- BeautifulSoup parsing of XHTML is fast. No performance concerns expected\n\n## Migration Notes\n\n- No migration needed — this is a new feature with no existing data to migrate\n- Optional dependency (`ebooklib`) means existing installs are unaffected\n- No breaking changes to any existing commands or APIs\n\n## References\n\n- [W3C EPUB 3.3 Specification](https://www.w3.org/TR/epub-33/) — authoritative source of truth\n- [W3C EPUB Reading Systems 3.3](https://www.w3.org/TR/epub-rs-33/) — reading system requirements\n- [ebooklib GitHub](https://github.com/aerkalov/ebooklib) — Python EPUB library\n- [ebooklib PyPI](https://pypi.org/project/EbookLib/) — v0.20, Python 3.9-3.13\n- [Research document](../research/2026-03-14-epub-input-support-affected-files.md) — affected files analysis\n- Similar implementation: `src/skill_seekers/cli/word_scraper.py` — closest analog\n- Similar tests: `tests/test_word_scraper.py` — test pattern template\n","docs/agents/research/2026-03-14-epub-input-support-affected-files.md":"---\ndate: 2026-03-14T12:54:24.700367+00:00\ngit_commit: 7c90a4b9c9bccac8341b0769550d77aae3b4e524\nbranch: development\ntopic: \"What files would be affected to add .epub support for input\"\ntags: [research, codebase, epub, input-format, scraper]\nstatus: complete\n---\n\n> 🗄️ **Historical — completed** — This research informed the EPUB implementation that is now live in Skill Seekers v3.6.0.\n\n# Research: What files would be affected to add .epub support for input\n\n## Research Question\n\nWhat files would be affected to add .epub support for input.\n\n## Summary\n\nAdding `.epub` input support follows an established pattern already used for PDF and Word (.docx) formats. The codebase has a consistent multi-layer architecture for document input formats: source detection, argument definitions, parser registration, create command routing, standalone scraper module, and tests. Based on analysis of the existing PDF and Word implementations, **16 existing files would need modification** and **4 new files would need to be created**.\n\n## Detailed Findings\n\n### New Files to Create (4 files)\n\n| File | Purpose |\n|------|---------|\n| `src/skill_seekers/cli/epub_scraper.py` | Core EPUB extraction and skill building logic (analog: `word_scraper.py` at ~750 lines) |\n| `src/skill_seekers/cli/arguments/epub.py` | EPUB-specific argument definitions (analog: `arguments/word.py`) |\n| `src/skill_seekers/cli/parsers/epub_parser.py` | Subcommand parser class (analog: `parsers/word_parser.py`) |\n| `tests/test_epub_scraper.py` | Test suite (analog: `test_word_scraper.py` at ~750 lines, 130+ tests) |\n\n### Existing Files to Modify (16 files)\n\n#### 1. Source Detection Layer\n\n**`src/skill_seekers/cli/source_detector.py`** (3 locations)\n\n- **`SourceDetector.detect()`** (line ~60): Add `.epub` extension check, following the `.docx` pattern at line 63-64:\n  ```python\n  if source.endswith(\".epub\"):\n      return cls._detect_epub(source)\n  ```\n\n- **New method `_detect_epub()`**: Add detection method (following `_detect_word()` at lines 124-129):\n  ```python\n  @classmethod\n  def _detect_epub(cls, source: str) -> SourceInfo:\n      name = os.path.splitext(os.path.basename(source))[0]\n      return SourceInfo(\n          type=\"epub\", parsed={\"file_path\": source}, suggested_name=name, raw_input=source\n      )\n  ```\n\n- **`validate_source()`** (line ~250): Add epub validation block (following the word block at lines 273-278)\n\n- **Error message** (line ~94): Add EPUB example to the `ValueError` help text\n\n#### 2. CLI Dispatcher\n\n**`src/skill_seekers/cli/main.py`** (2 locations)\n\n- **`COMMAND_MODULES` dict** (line ~46): Add epub entry:\n  ```python\n  \"epub\": \"skill_seekers.cli.epub_scraper\",\n  ```\n\n- **Module docstring** (line ~1): Add `epub` to the commands list\n\n#### 3. Create Command Routing\n\n**`src/skill_seekers/cli/create_command.py`** (3 locations)\n\n- **`_route_to_scraper()`** (line ~121): Add `elif self.source_info.type == \"epub\":` routing case\n\n- **New `_route_epub()` method**: Following the `_route_word()` pattern at lines 331-352:\n  ```python\n  def _route_epub(self) -> int:\n      from skill_seekers.cli import epub_scraper\n      argv = [\"epub_scraper\"]\n      file_path = self.source_info.parsed[\"file_path\"]\n      argv.extend([\"--epub\", file_path])\n      self._add_common_args(argv)\n      # epub-specific args here\n      ...\n  ```\n\n- **`main()` epilog** (line ~537): Add EPUB example and source auto-detection entry\n\n- **Progressive help** (line ~590): Add `--help-epub` flag and handler block\n\n#### 4. Argument Definitions\n\n**`src/skill_seekers/cli/arguments/create.py`** (4 locations)\n\n- **New `EPUB_ARGUMENTS` dict** (~line 401): Define epub-specific arguments (e.g., `--epub` file path flag), following the `WORD_ARGUMENTS` pattern at lines 402-411\n\n- **`get_source_specific_arguments()`** (line 595): Add `\"epub\": EPUB_ARGUMENTS` to the `source_args` dict\n\n- **`add_create_arguments()`** (line 676): Add epub mode block:\n  ```python\n  if mode in [\"epub\", \"all\"]:\n      for arg_name, arg_def in EPUB_ARGUMENTS.items():\n          parser.add_argument(*arg_def[\"flags\"], **arg_def[\"kwargs\"])\n  ```\n\n#### 5. Parser Registration\n\n**`src/skill_seekers/cli/parsers/__init__.py`** (2 locations)\n\n- **Import** (line ~15): Add `from .epub_parser import EpubParser`\n\n- **`PARSERS` list** (line ~46): Add `EpubParser()` entry (near `WordParser()` and `PDFParser()`)\n\n#### 6. Package Configuration\n\n**`pyproject.toml`** (3 locations)\n\n- **`[project.optional-dependencies]`** (line ~111): Add `epub` optional dependency group:\n  ```toml\n  epub = [\n      \"ebooklib>=0.18\",\n  ]\n  ```\n\n- **`all` optional dependency group** (line ~178): Add epub dependency to the combined `all` group\n\n- **`[project.scripts]`** (line ~224): Add standalone entry point:\n  ```toml\n  skill-seekers-epub = \"skill_seekers.cli.epub_scraper:main\"\n  ```\n\n#### 7. Argument Commons\n\n**`src/skill_seekers/cli/arguments/common.py`**\n\n- No changes strictly required, but `add_all_standard_arguments()` is called by the new `arguments/epub.py` (no modification needed — it's used as-is)\n\n#### 8. Documentation / Configuration\n\n**`CLAUDE.md`** (2 locations)\n\n- **Commands section**: Add `epub` to the list of subcommands\n- **Key source files table**: Add `epub_scraper.py` entry\n\n**`CONTRIBUTING.md`** — Potentially update with epub format mention\n\n**`CHANGELOG.md`** — New feature entry\n\n### Files NOT Affected\n\nThese files do **not** need changes:\n\n- **`unified_scraper.py`** — Multi-source configs could add epub support later but it's not required for basic input support\n- **Platform adaptors** (`adaptors/*.py`) — Adaptors work on the output side (packaging), not input\n- **Enhancement system** (`enhance_skill.py`, `enhance_skill_local.py`) — Works generically on SKILL.md\n- **MCP server** (`mcp/server_fastmcp.py`) — Operates on completed skills\n- **`pdf_extractor_poc.py`** — PDF-specific extraction; epub needs its own extractor\n\n## Code References\n\n### Pattern to Follow (Word .docx implementation)\n\n- `src/skill_seekers/cli/word_scraper.py:1-750` — Full scraper with `WordToSkillConverter` class\n- `src/skill_seekers/cli/arguments/word.py:1-75` — Argument definitions with `add_word_arguments()`\n- `src/skill_seekers/cli/parsers/word_parser.py:1-33` — Parser class extending `SubcommandParser`\n- `tests/test_word_scraper.py:1-750` — Comprehensive test suite with 130+ tests\n\n### Key Integration Points\n\n- `src/skill_seekers/cli/source_detector.py:57-65` — File extension detection order\n- `src/skill_seekers/cli/source_detector.py:124-129` — `_detect_word()` method (template for `_detect_epub()`)\n- `src/skill_seekers/cli/create_command.py:121-143` — `_route_to_scraper()` dispatch\n- `src/skill_seekers/cli/create_command.py:331-352` — `_route_word()` (template for `_route_epub()`)\n- `src/skill_seekers/cli/arguments/create.py:401-411` — `WORD_ARGUMENTS` dict (template)\n- `src/skill_seekers/cli/arguments/create.py:595-604` — `get_source_specific_arguments()` mapping\n- `src/skill_seekers/cli/arguments/create.py:676-678` — `add_create_arguments()` mode handling\n- `src/skill_seekers/cli/parsers/__init__.py:35-59` — `PARSERS` registry list\n- `src/skill_seekers/cli/main.py:46-70` — `COMMAND_MODULES` dict\n- `pyproject.toml:111-115` — Optional dependency group pattern (docx)\n- `pyproject.toml:213-246` — Script entry points\n\n### Data Flow Architecture\n\nThe epub scraper would follow the same three-step pipeline as Word/PDF:\n\n1. **Extract** — Parse `.epub` file → sections with text, headings, code, images → save to `output/{name}_extracted.json`\n2. **Categorize** — Group sections by chapters/keywords\n3. **Build** — Generate `SKILL.md`, `references/*.md`, `references/index.md`, `assets/`\n\nThe intermediate JSON format uses the same structure as Word/PDF:\n```python\n{\n    \"source_file\": str,\n    \"metadata\": {\"title\", \"author\", \"created\", ...},\n    \"total_sections\": int,\n    \"total_code_blocks\": int,\n    \"total_images\": int,\n    \"languages_detected\": {str: int},\n    \"pages\": [  # sections\n        {\n            \"section_number\": int,\n            \"heading\": str,\n            \"text\": str,\n            \"code_samples\": [...],\n            \"images\": [...],\n            \"headings\": [...]\n        }\n    ]\n}\n```\n\n## Architecture Documentation\n\n### Document Input Format Pattern\n\nEach input format follows a consistent architecture:\n\n```\n[source_detector.py] → detect type by extension\n        ↓\n[create_command.py] → route to scraper\n        ↓\n[{format}_scraper.py] → extract → categorize → build skill\n        ↓\n[output/{name}/] → SKILL.md + references/ + assets/\n```\n\nSupporting files per format:\n- `arguments/{format}.py` — CLI argument definitions\n- `parsers/{format}_parser.py` — Subcommand parser class\n- `tests/test_{format}_scraper.py` — Test suite\n\n### Dependency Guard Pattern\n\nThe Word scraper uses an optional dependency guard that epub should replicate:\n\n```python\ntry:\n    import ebooklib\n    from ebooklib import epub\n    EPUB_AVAILABLE = True\nexcept ImportError:\n    EPUB_AVAILABLE = False\n\ndef _check_epub_deps():\n    if not EPUB_AVAILABLE:\n        raise RuntimeError(\n            \"ebooklib is required for EPUB support.\\n\"\n            'Install with: pip install \"skill-seekers[epub]\"\\n'\n            \"Or: pip install ebooklib\"\n        )\n```\n\n## Summary Table\n\n| Category | Files | Action |\n|----------|-------|--------|\n| New files | 4 | Create from scratch |\n| Source detection | 1 | Add epub detection + validation |\n| CLI dispatcher | 1 | Add command module mapping |\n| Create command | 1 | Add routing + help + examples |\n| Arguments | 1 | Add EPUB_ARGUMENTS + register in helpers |\n| Parser registry | 1 | Import + register EpubParser |\n| Package config | 1 | Add deps + entry point |\n| Documentation | 2+ | Update CLAUDE.md, CHANGELOG |\n| **Total** | **12+ modified, 4 new** | |\n\n## Open Questions\n\n- Should epub support reuse any of the existing HTML parsing from `word_scraper.py` (which uses mammoth to convert to HTML then parses with BeautifulSoup)? EPUB internally contains XHTML files, so BeautifulSoup parsing would be directly applicable.\n- Should the epub scraper support DRM-protected files, or only DRM-free epub files?\n- Should epub-specific arguments include options like `--chapter-range` (similar to PDF's `--pages`)?\n","skills/skill-seekers/SKILL.md":"---\nname: skill-builder\ndescription: Automatically detect source types and build AI skills using Skill Seekers. Use when the user wants to create skills from documentation, repos, PDFs, videos, or other knowledge sources.\n---\n\n# Skill Builder\n\nYou have access to the Skill Seekers MCP server which provides 40 tools for converting knowledge sources into AI-ready skills.\n\n## When to Use This Skill\n\nUse this skill when the user:\n- Wants to create an AI skill from a documentation site, GitHub repo, PDF, video, or other source\n- Needs to convert documentation into a format suitable for LLM consumption\n- Wants to update or sync existing skills with their source documentation\n- Needs to export skills to vector databases (Weaviate, Chroma, FAISS, Qdrant)\n- Asks about scraping, converting, or packaging documentation for AI\n\n## Source Type Detection\n\nAutomatically detect the source type from user input:\n\n| Input Pattern | Source Type | Tool to Use |\n|---------------|-------------|-------------|\n| `https://...` (not GitHub/YouTube) | Documentation | `scrape_docs` |\n| `owner/repo` or `github.com/...` | GitHub | `scrape_github` |\n| `*.pdf` | PDF | `scrape_pdf` |\n| YouTube/Vimeo URL or video file | Video | `scrape_video` |\n| Local directory path | Codebase | `scrape_codebase` |\n| `*.ipynb`, `*.html`, `*.yaml` (OpenAPI), `*.adoc`, `*.pptx`, `*.rss`, `*.1`-`.8` | Various | `scrape_generic` |\n| JSON config file | Unified | Use config with `scrape_docs` |\n\n## Recommended Workflow\n\n1. **Detect source type** from the user's input\n2. **Generate or fetch config** using `generate_config` or `fetch_config` if needed\n3. **Estimate scope** with `estimate_pages` for documentation sites\n4. **Scrape the source** using the appropriate scraping tool\n5. **Enhance** with `enhance_skill` if the user wants AI-powered improvements\n6. **Package** with `package_skill` for the target platform\n7. **Export to vector DB** if requested using `export_to_*` tools\n\n## Available MCP Tools\n\n### Config Management\n- `generate_config` — Generate a scraping config from a URL\n- `list_configs` — List available preset configs\n- `validate_config` — Validate a config file\n\n### Scraping (use based on source type)\n- `scrape_docs` — Documentation sites\n- `scrape_github` — GitHub repositories\n- `scrape_pdf` — PDF files\n- `scrape_video` — Video transcripts\n- `scrape_codebase` — Local code analysis\n- `scrape_generic` — Jupyter, HTML, OpenAPI, AsciiDoc, PPTX, RSS, manpage, Confluence, Notion, chat\n\n### Post-processing\n- `enhance_skill` — AI-powered skill enhancement\n- `package_skill` — Package for target platform\n- `upload_skill` — Upload to platform API\n- `install_skill` — End-to-end install workflow\n\n### Advanced\n- `detect_patterns` — Design pattern detection in code\n- `extract_test_examples` — Extract usage examples from tests\n- `build_how_to_guides` — Generate how-to guides from tests\n- `split_config` — Split large configs into focused skills\n- `export_to_weaviate`, `export_to_chroma`, `export_to_faiss`, `export_to_qdrant` — Vector DB export\n","tests/golden/phase2/chat/SKILL.md":"---\nname: golden-chat\ndescription: Use when testing the golden_chat golden build\n---\n\n# Golden_Chat Slack Chat Skill\n\nUse when testing the golden_chat golden build\n\n## 📋 Slack Chat Information\n\n**Platform:** Slack\n\n**Source:** fixtures/slack-export/\n\n**Total Messages:** 6\n\n**Unique Users:** 3\n\n**Channels:** #engineering, #random\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **#engineering**: 2 sections\n- **#random**: 1 sections\n\n## 🔑 Key Discussion Topics\n\n*Topics frequently discussed in chat*\n\n- **Troubleshooting**: 1 conversations\n- **Setup**: 1 conversations\n\n## 📝 Top Code Snippets\n\n*High-quality code shared in chat*\n\n### Python (2 snippets)\n\n**Snippet 1** (by bob) (Quality: 9.5/10):\n\n```python\ndef long_helper():\n    y0 = 0\n    y1 = 1\n    y2 = 2\n    y3 = 3\n    y4 = 4\n    y5 = 5\n    y6 = 6\n    y7 = 7\n    y8 = 8\n    y9 = 9\n    y10 = 10\n    y11 = 11\n    y12 = 12\n    y13 = 13\n    y14 = 14\n    y15 = 15\n    y16 = 16\n    y17 = 17\n    y18 = 18\n    y19 = 19\n    y20 = 20\n    y21 = 21\n    y22 = 22\n    y23 = 23\n    y24 = 24\n    y25 = 25\n    y26 = 26\n    y27 = 27\n    y28 = 28\n    y29 = 29\n    y30 = 30\n    y31 = 31\n    y32 = 32\n    y33 = 33\n    y34 = 34\n    y35 = 35\n    y36 = 36\n    y37 = 37\n    y38\n...\n```\n\n**Snippet 2** (by bob) (Quality: 7.0/10):\n\n```python\nprint('patched')\n```\n\n### Unknown (1 snippets)\n\n**Snippet 1** (by alice) (Quality: 4.0/10):\n\n```unknown\nkubectl get pods\n```\n\n## 🔗 Shared Links (21)\n\n*Key resources shared in chat*\n\n- https://example.com/resource/0 (by alice, in #engineering)\n- https://example.com/resource/1 (by carol, in #random)\n- https://example.com/resource/2 (by alice, in #engineering)\n- https://example.com/resource/3 (by carol, in #random)\n- https://example.com/resource/4 (by alice, in #engineering)\n- https://example.com/resource/5 (by carol, in #random)\n- https://example.com/resource/6 (by alice, in #engineering)\n- https://example.com/resource/7 (by carol, in #random)\n- https://example.com/resource/8 (by alice, in #engineering)\n- https://example.com/resource/9 (by carol, in #random)\n- https://example.com/resource/10 (by alice, in #engineering)\n- https://example.com/resource/11 (by carol, in #random)\n- https://example.com/resource/12 (by alice, in #engineering)\n- https://example.com/resource/13 (by carol, in #random)\n- https://example.com/resource/14 (by alice, in #engineering)\n- https://example.com/resource/15 (by carol, in #random)\n- https://example.com/resource/16 (by alice, in #engineering)\n- https://example.com/resource/17 (by carol, in #random)\n- https://example.com/resource/18 (by alice, in #engineering)\n- https://example.com/resource/19 (by carol, in #random)\n\n*... and 1 more links*\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 6\n- **Total Threads**: 1\n- **Code Snippets**: 3\n- **Shared Links**: 21\n- **Unique Users**: 3\n- **Channels**: 2\n\n**Channel Activity:**\n\n- #engineering: 5 messages, 2 users\n- #random: 1 messages, 1 users\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/engineering_s1-s2.md` - #engineering\n- `references/random_s3-s3.md` - #random\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Slack Chat Scraper\n","tests/golden/phase2/chat_empty/SKILL.md":"---\nname: golden-chat-empty\ndescription: Use when testing the golden_chat_empty golden build\n---\n\n# Golden_Chat_Empty Slack Chat Skill\n\nUse when testing the golden_chat_empty golden build\n\n## 📋 Slack Chat Information\n\n**Platform:** Slack\n\n**Source:** fixtures/empty-export/\n\n**Total Messages:** 0\n\n**Unique Users:** 0\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat_empty chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 0\n\n**Content Breakdown:**\n\n- **Chat Content**: 0 sections\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 0\n- **Total Threads**: 0\n- **Code Snippets**: 0\n- **Shared Links**: 0\n- **Unique Users**: 0\n- **Channels**: 0\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_01.md` - Chat Content\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Slack Chat Scraper\n","tests/golden/phase2/chat_single/SKILL.md":"---\nname: golden-chat-single\ndescription: Use when testing the golden_chat_single golden build\n---\n\n# Golden_Chat_Single Slack Chat Skill\n\nUse when testing the golden_chat_single golden build\n\n## 📋 Slack Chat Information\n\n**Platform:** Slack\n\n**Source:** fixtures/slack-export/\n\n**Total Messages:** 1\n\n**Unique Users:** 1\n\n**Channels:** #general\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat_single chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 1\n\n**Content Breakdown:**\n\n- **General Discussion**: 1 sections\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 1\n- **Total Threads**: 0\n- **Code Snippets**: 0\n- **Shared Links**: 0\n- **Unique Users**: 1\n- **Channels**: 1\n\n**Channel Activity:**\n\n- #general: 1 messages, 1 users\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/main.md` - General Discussion\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Slack Chat Scraper\n","tests/golden/phase2/chat_topics/SKILL.md":"---\nname: golden-chat-topics\ndescription: Use when testing the golden_chat_topics golden build\n---\n\n# Golden_Chat_Topics Discord Chat Skill\n\nUse when testing the golden_chat_topics golden build\n\n## 📋 Discord Chat Information\n\n**Platform:** Discord\n\n**Source:** fixtures/discord-export.json\n\n**Total Messages:** 3\n\n**Unique Users:** 2\n\n**Channels:** #help\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat_topics chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Troubleshooting**: 1 sections\n- **General Discussion**: 1 sections\n\n## 🔑 Key Discussion Topics\n\n*Topics frequently discussed in chat*\n\n- **Troubleshooting**: 1 conversations\n- **Setup**: 1 conversations\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 3\n- **Total Threads**: 0\n- **Code Snippets**: 0\n- **Shared Links**: 0\n- **Unique Users**: 2\n- **Channels**: 1\n\n**Channel Activity:**\n\n- #help: 3 messages, 2 users\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/setup_s2-s2.md` - Setup\n- `references/troubleshooting_s1-s1.md` - Troubleshooting\n- `references/general_s3-s3.md` - General Discussion\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Discord Chat Scraper\n","tests/golden/phase2/epub/SKILL.md":"---\nname: golden-epub\ndescription: Use when testing the epub golden build\n---\n\n# Golden_Epub Documentation Skill\n\nUse when testing the epub golden build\n\n## 📋 Document Information\n\n**Title:** The Handbook\n\n**Author:** Jane Doe\n\n**Language:** en\n\n**Publisher:** Acme Press\n\n**Date:** 2024-01-01\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_epub concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **handbook**: 3 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 1\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/handbook.md` - handbook\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | EPUB Scraper\n","tests/golden/phase2/epub_kw/SKILL.md":"---\nname: golden-epub-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Epub_Kw Documentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_epub_kw concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Api**: 1 sections\n- **Other**: 1 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 1\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s2-s2.md` - Api\n- `references/section_s3-s3.md` - Other\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | EPUB Scraper\n","tests/golden/phase2/html/SKILL.md":"---\nname: golden-html\ndescription: Use when testing the html golden build\n---\n\n# Golden_Html Documentation Skill\n\nUse when testing the html golden build\n\n## 📋 Document Information\n\n**Title:** The Web Handbook\n\n**Author:** Jane Doe\n\n**Language:** en\n\n**Description:** A handbook about the web.\n\n**Keywords:** web, html, docs\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_html concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 4\n\n**Content Breakdown:**\n\n- **page**: 4 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n- Changelog\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Changelog** (1 sections):\n- Changelog (section 4)\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 4\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **HTML Files**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/page.md` - page\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | HTML Scraper\n","tests/golden/phase2/html_kw/SKILL.md":"---\nname: golden-html-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Html_Kw Documentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_html_kw concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 4\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Api**: 1 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n- Changelog\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Changelog** (1 sections):\n- Changelog (section 4)\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 4\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **HTML Files**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s2-s2.md` - Api\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | HTML Scraper\n","tests/golden/phase2/html_multi/SKILL.md":"---\nname: golden-html-multi\ndescription: Use when testing the multi-file html build\n---\n\n# Golden_Html_Multi Documentation Skill\n\nUse when testing the multi-file html build\n\n## 📋 Document Information\n\n**Title:** The Web Handbook\n\n**Source files:** 2 HTML files\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_html_multi concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 4\n\n**Content Breakdown:**\n\n- **intro**: 2 sections\n- **extras**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n- Changelog\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Changelog** (1 sections):\n- Changelog (section 4)\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 4\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **HTML Files**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/golden_html_multi_s1-s2.md` - intro\n- `references/golden_html_multi_s3-s4.md` - extras\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | HTML Scraper\n","tests/golden/phase2/jupyter/SKILL.md":"---\nname: golden-jupyter\ndescription: Use when testing the golden_jupyter golden build\n---\n\n# Golden_Jupyter Notebook Skill\n\nUse when testing the golden_jupyter golden build\n\n## 📋 Notebook Information\n\n**Kernel:** Python 3\n\n**Language:** python 3.11.4\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **analysis**: 5 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/analysis.md` - analysis\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n","tests/golden/phase2/jupyter_dir/SKILL.md":"---\nname: golden-jupyter-dir\ndescription: Use when testing the golden_jupyter_dir golden build\n---\n\n# Golden_Jupyter_Dir Notebook Skill\n\nUse when testing the golden_jupyter_dir golden build\n\n## 📋 Notebook Information\n\n**Kernel:** Python 3\n\n**Language:** python 3.11.4\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter_dir concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **Data Loading**: 1 sections\n- **Evaluation**: 1 sections\n- **Setup**: 1 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s2-s2.md` - Data Loading\n- `references/section_s5-s5.md` - Evaluation\n- `references/section_s1-s1.md` - Setup\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n","tests/golden/phase2/jupyter_kw/SKILL.md":"---\nname: golden-jupyter-kw\ndescription: Use when testing the golden_jupyter_kw golden build\n---\n\n# Golden_Jupyter_Kw Notebook Skill\n\nUse when testing the golden_jupyter_kw golden build\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter_kw concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Modeling**: 1 sections\n- **Loading**: 1 sections\n- **Empty Cat**: 0 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s5-s5.md` - Modeling\n- `references/section_s2-s2.md` - Loading\n- `references/section_04.md` - Empty Cat\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n","tests/golden/phase2/jupyter_topics/SKILL.md":"---\nname: golden-jupyter-topics\ndescription: Use when testing the golden_jupyter_topics golden build\n---\n\n# Golden_Jupyter_Topics Notebook Skill\n\nUse when testing the golden_jupyter_topics golden build\n\n## 📋 Notebook Information\n\n**Kernel:** Python 3\n\n**Language:** python 3.11.4\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter_topics concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **Data Loading**: 1 sections\n- **Evaluation**: 1 sections\n- **Setup**: 1 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s2-s2.md` - Data Loading\n- `references/section_s5-s5.md` - Evaluation\n- `references/section_s1-s1.md` - Setup\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n","tests/golden/phase2/man/SKILL.md":"---\nname: golden-man\ndescription: Use when testing the man golden build\n---\n\n# Golden_Man Man Pages Skill\n\nUse when testing the man golden build\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_man command-line tools and their options\n- Look up command syntax and usage patterns\n- Find examples of common command invocations\n- Review available flags and environment variables\n- Explore related commands via SEE ALSO references\n\n## Quick Command Reference\n\n### git-log\n\n```\ngit log [<options>] [<revision-range>] [[--] <path>...]\n```\n\n### git-diff\n\n```\ngit diff [<options>] [<commit>] [--] [<path>...]\n```\n\n## Man Page Overview\n\n**Total Man Pages:** 3\n\n**Content Breakdown:**\n\n- **Git**: 2 man page(s)\n- **Curl**: 1 man page(s)\n\n## Common Options\n\n*3 options extracted across all man pages*\n\n### git-log\n\n- `-p` -- Generate patch output.\n- `--max-count=<number>` -- Limit the number of commits to output, interacting subtly with pathspec filtering, history simplification, and the --fol...\n\n### curl\n\n- `-s, --silent` -- Silent mode.\n\n## Examples\n\n*3 example(s) extracted from man pages*\n\n### git-log\n\nShow the last three commits\n\n```bash\ngit log -3\n```\n\n### git-log\n\nProse-only example with no command\n\n### curl\n\nFetch a page\n\n```bash\ncurl https://example.com\n```\n\n## Related Commands (SEE ALSO)\n\n- `git-diff`\n- `git-log`\n- `gitk`\n\n## Documentation Statistics\n\n- **Total Man Pages**: 3\n- **Total Options**: 3\n- **Total Examples**: 3\n- **Cross-references**: 3\n\n## Navigation\n\n**Reference Files:**\n\n- `references/git_01.md` -- Git\n- `references/curl_02.md` -- Curl\n\nSee `references/index.md` for complete reference structure.\n\n---\n\n**Generated by Skill Seekers** | Man Page Scraper\n","tests/golden/phase2/man_kw/SKILL.md":"---\nname: golden-man-kw\ndescription: Use when testing the man golden build\n---\n\n# Golden_Man_Kw Man Pages Skill\n\nUse when testing the man golden build\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_man_kw command-line tools and their options\n- Look up command syntax and usage patterns\n- Find examples of common command invocations\n- Review available flags and environment variables\n- Explore related commands via SEE ALSO references\n\n## Quick Command Reference\n\n### git-log\n\n```\ngit log [<options>] [<revision-range>] [[--] <path>...]\n```\n\n### git-diff\n\n```\ngit diff [<options>] [<commit>] [--] [<path>...]\n```\n\n## Man Page Overview\n\n**Total Man Pages:** 3\n\n**Content Breakdown:**\n\n- **Version Control**: 2 man page(s)\n- **Other**: 1 man page(s)\n\n## Common Options\n\n*3 options extracted across all man pages*\n\n### git-log\n\n- `-p` -- Generate patch output.\n- `--max-count=<number>` -- Limit the number of commits to output, interacting subtly with pathspec filtering, history simplification, and the --fol...\n\n### curl\n\n- `-s, --silent` -- Silent mode.\n\n## Examples\n\n*3 example(s) extracted from man pages*\n\n### git-log\n\nShow the last three commits\n\n```bash\ngit log -3\n```\n\n### git-log\n\nProse-only example with no command\n\n### curl\n\nFetch a page\n\n```bash\ncurl https://example.com\n```\n\n## Related Commands (SEE ALSO)\n\n- `git-diff`\n- `git-log`\n- `gitk`\n\n## Documentation Statistics\n\n- **Total Man Pages**: 3\n- **Total Options**: 3\n- **Total Examples**: 3\n- **Cross-references**: 3\n\n## Navigation\n\n**Reference Files:**\n\n- `references/version_control_01.md` -- Version Control\n- `references/other_02.md` -- Other\n\nSee `references/index.md` for complete reference structure.\n\n---\n\n**Generated by Skill Seekers** | Man Page Scraper\n","tests/golden/phase2/man_single/SKILL.md":"---\nname: golden-man-single\ndescription: Use when testing the man golden build\n---\n\n# Golden_Man_Single Man Pages Skill\n\nUse when testing the man golden build\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_man_single command-line tools and their options\n- Look up command syntax and usage patterns\n- Find examples of common command invocations\n- Review available flags and environment variables\n- Explore related commands via SEE ALSO references\n\n## Man Page Overview\n\n**Total Man Pages:** 1\n\n**Content Breakdown:**\n\n- **curl**: 1 man page(s)\n\n## Common Options\n\n*1 options extracted across all man pages*\n\n### curl\n\n- `-s, --silent` -- Silent mode.\n\n## Examples\n\n*1 example(s) extracted from man pages*\n\n### curl\n\nFetch a page\n\n```bash\ncurl https://example.com\n```\n\n## Documentation Statistics\n\n- **Total Man Pages**: 1\n- **Total Options**: 1\n- **Total Examples**: 1\n- **Cross-references**: 0\n\n## Navigation\n\n**Reference Files:**\n\n- `references/curl.md` -- curl\n\nSee `references/index.md` for complete reference structure.\n\n---\n\n**Generated by Skill Seekers** | Man Page Scraper\n","tests/golden/phase2/pdf/SKILL.md":"---\nname: golden-pdf\ndescription: Use when testing the pdf golden build\n---\n\n# Golden_Pdf Documentation Skill\n\nUse when testing the pdf golden build\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pdf concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Chapter Overview\n\n**Total Pages:** 3\n\n**Content Breakdown:**\n\n- **manual**: 3 pages\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (page 1)\n\n**Installation** (1 sections):\n- Installation Steps (page 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (page 3)\n\n**Usage** (1 sections):\n- API Usage (page 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Documentation Statistics\n\n- **Total Pages**: 3\n- **Code Blocks**: 4\n- **Images/Diagrams**: 2\n- **Programming Languages**: 3\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n- text: 1 examples\n\n**Code Quality:**\n\n- Average Quality Score: 7.4/10\n- Valid Code Blocks: 4\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/manual.md` - manual\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | PDF Documentation Scraper\n","tests/golden/phase2/pdf_chapters/SKILL.md":"---\nname: golden-pdf-ch\ndescription: Use when testing chapter categorization\n---\n\n# Golden_Pdf_Ch Documentation Skill\n\nUse when testing chapter categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pdf_ch concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Chapter Overview\n\n**Total Pages:** 4\n\n**Content Breakdown:**\n\n- **Chapter 1: Basics**: 2 pages\n- **Chapter 2: Advanced**: 1 pages\n- **Additional Content**: 1 pages\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (page 1)\n\n**Installation** (1 sections):\n- Installation Steps (page 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (page 3)\n\n**Usage** (1 sections):\n- API Usage (page 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Documentation Statistics\n\n- **Total Pages**: 4\n- **Code Blocks**: 4\n- **Images/Diagrams**: 2\n- **Programming Languages**: 3\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n- text: 1 examples\n\n**Code Quality:**\n\n- Average Quality Score: 7.4/10\n- Valid Code Blocks: 4\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_p1-p2.md` - Chapter 1: Basics\n- `references/section_p3-p3.md` - Chapter 2: Advanced\n- `references/section_p4-p4.md` - Additional Content\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | PDF Documentation Scraper\n","tests/golden/phase2/pdf_kw/SKILL.md":"---\nname: golden-pdf-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Pdf_Kw Documentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pdf_kw concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Chapter Overview\n\n**Total Pages:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 pages\n- **Api**: 1 pages\n- **Deployment**: 0 pages\n- **Other**: 1 pages\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (page 1)\n\n**Installation** (1 sections):\n- Installation Steps (page 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (page 3)\n\n**Usage** (1 sections):\n- API Usage (page 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Documentation Statistics\n\n- **Total Pages**: 3\n- **Code Blocks**: 4\n- **Images/Diagrams**: 2\n- **Programming Languages**: 3\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n- text: 1 examples\n\n**Code Quality:**\n\n- Average Quality Score: 7.4/10\n- Valid Code Blocks: 4\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_p1-p1.md` - Setup\n- `references/section_p2-p2.md` - Api\n- `references/section_03.md` - Deployment\n- `references/section_p3-p3.md` - Other\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | PDF Documentation Scraper\n","tests/golden/phase2/pptx/SKILL.md":"---\nname: golden-pptx\ndescription: Use when testing the pptx golden build\n---\n\n# Golden_Pptx Presentation Skill\n\nUse when testing the pptx golden build\n\n## 📋 Presentation Information\n\n**Title:** The Deck\n\n**Author:** Jane Doe\n\n**Subject:** Quarterly architecture review\n\n**Category:** Engineering\n\n**Created:** 2024-01-01\n\n**Modified:** 2024-03-03\n\n**Slides:** 8\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pptx concepts and fundamentals\n- Review presentation content and key points\n- Find code examples and implementation patterns\n- Access speaker notes and additional context\n- Reference tables and data from the presentation\n\n## 📖 Section Overview\n\n**Total Slides:** 8\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **deck**: 3 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this presentation*\n\n**Major Sections:**\n\n- Getting Started Guide\n- Summary and Q&A\n\n**Subsections:**\n\n- Installation Steps\n- Architecture Overview\n\n## ⚡ Quick Reference\n\n*Common presentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Overview** (1 sections):\n- Architecture Overview (section 2)\n\n**Summary** (1 sections):\n- Summary and Q&A (section 3)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from presentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in presentation*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: Architecture Overview**\n\n## 📊 Presentation Statistics\n\n- **Total Slides**: 8\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/deck.md` - deck\n\nSee `references/index.md` for complete presentation structure.\n\n---\n\n**Generated by Skill Seeker** | PowerPoint Presentation Scraper\n","tests/golden/phase2/pptx_kw/SKILL.md":"---\nname: golden-pptx-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Pptx_Kw Presentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pptx_kw concepts and fundamentals\n- Review presentation content and key points\n- Find code examples and implementation patterns\n- Access speaker notes and additional context\n- Reference tables and data from the presentation\n\n## 📖 Section Overview\n\n**Total Slides:** 8\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Api**: 1 sections\n- **Other**: 1 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this presentation*\n\n**Major Sections:**\n\n- Getting Started Guide\n- Architecture Overview\n- Summary and Q&A\n\n**Slide Topics:**\n\n- Slide 2: Verify Setup\n- Slide 3: First Demo\n- Slide 8: Common Errors\n\n## ⚡ Quick Reference\n\n*Common presentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Overview** (1 sections):\n- Architecture Overview (section 2)\n\n**Summary** (1 sections):\n- Summary and Q&A (section 3)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from presentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in presentation*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: Architecture Overview**\n\n## 📊 Presentation Statistics\n\n- **Total Slides**: 8\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s2-s2.md` - Api\n- `references/section_s3-s3.md` - Other\n\nSee `references/index.md` for complete presentation structure.\n\n---\n\n**Generated by Skill Seeker** | PowerPoint Presentation Scraper\n","tests/golden/phase2/rss/SKILL.md":"---\nname: golden-rss\ndescription: Use when testing the rss golden build\n---\n\n# Example Engineering Blog Feed Skill\n\nUse when testing the rss golden build\n\n## 📡 Feed Information\n\n**Feed Title:** Example Engineering Blog\n\n**Feed Type:** RSS 2.0\n\n**Website:** https://example.com\n\n**Language:** en-us\n\n**Description:** A feed description that is intentionally longer than the three hundred character limit applied in the Feed Information block of SKILL.md. A feed description that is intentionally longer than the three hundred character limit applied in the Feed Information block of SKILL.md. A feed description th...\n\n**Generator:** ExampleCMS 2.0\n\n**Rights:** © Example Inc.\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Reference articles and content from Example Engineering Blog\n- Look up specific topics covered in the feed\n- Find author perspectives and expert analysis\n- Review recent posts and updates on the subject\n- Explore categorized content by tags or topics\n\n## 📖 Article Overview\n\n**Total Articles:** 4\n\n**Content by Category:**\n\n- **Dev Ops**: 1 articles\n- **Python**: 1 articles\n- **uncategorized**: 1 articles\n- **★★★**: 1 articles\n\n## 📰 Recent Articles\n\n### Continuous Delivery in Practice\n\n**Published:** Mon, 01 Jan 2024 10:00:00 GMT | **Author:** Jane Doe\n\nThis is a deliberately long summary that keeps going well past the two hundred character truncation threshold used by the recent-articles block of SKILL.md so that the shortened form with a trailing e...\n\n[Read more](https://example.com/posts/cd-in-practice)\n\n### Typing Tips for Python\n\n**Published:** Fri, 15 Mar 2024 08:30:00 GMT | **Author:** John Roe\n\nShort notes on gradual typing.\n\n[Read more](https://example.com/posts/typing-tips)\n\n### An Uncategorized Note\n\n**Author:** Jane Doe\n\nA note without tags.\n\n### Symbols Only\n\n**Published:** Sat, 10 Feb 2024 12:00:00 GMT\n\n[Read more](https://example.com/posts/symbols)\n\n## ✍️ Authors (2)\n\n- **Jane Doe**: 2 articles\n- **John Roe**: 1 articles\n\n## 🏷️ Tags (55)\n\n`Dev Ops`, `Python`, `dev-ops`, `tag00`, `tag01`, `tag02`, `tag03`, `tag04`, `tag05`, `tag06`, `tag07`, `tag08`, `tag09`, `tag10`, `tag11`, `tag12`, `tag13`, `tag14`, `tag15`, `tag16`, `tag17`, `tag18`, `tag19`, `tag20`, `tag21`, `tag22`, `tag23`, `tag24`, `tag25`, `tag26`, `tag27`, `tag28`, `tag29`, `tag30`, `tag31`, `tag32`, `tag33`, `tag34`, `tag35`, `tag36`, `tag37`, `tag38`, `tag39`, `tag40`, `tag41`, `tag42`, `tag43`, `tag44`, `tag45`, `tag46` ... and 5 more\n\n## 📊 Feed Statistics\n\n- **Total Articles**: 4\n- **Feed Type**: RSS 2.0\n- **Categories/Tags**: 55\n- **Authors**: 2\n- **Full Content Scraped**: Yes\n\n- **Date Range**: 2024-01-01 to 2024-03-15\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/dev_ops.md` - Dev Ops (1 articles)\n- `references/python.md` - Python (1 articles)\n- `references/uncategorized.md` - uncategorized (1 articles)\n- `references/unnamed.md` - ★★★ (1 articles)\n\nSee `references/index.md` for complete feed structure.\n\n---\n\n**Generated by Skill Seeker** | RSS/Atom Feed Scraper\n","tests/golden/phase2/rss_empty/SKILL.md":"---\nname: golden-rss-empty\ndescription: Use when testing the empty rss golden build\n---\n\n# Quiet Feed Feed Skill\n\nUse when testing the empty rss golden build\n\n## 📡 Feed Information\n\n**Feed Title:** Quiet Feed\n\n**Feed Type:** Atom\n\n**Website:** https://example.com/quiet\n\n**Description:** A feed with no entries yet.\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Reference articles and content from Quiet Feed\n- Look up specific topics covered in the feed\n- Find author perspectives and expert analysis\n- Review recent posts and updates on the subject\n- Explore categorized content by tags or topics\n\n## 📖 Article Overview\n\n**Total Articles:** 0\n\n**Content by Category:**\n\n- **All Articles**: 0 articles\n\n## 📊 Feed Statistics\n\n- **Total Articles**: 0\n- **Feed Type**: Atom\n- **Categories/Tags**: 0\n- **Authors**: 0\n- **Full Content Scraped**: No\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/all_articles.md` - All Articles (0 articles)\n\nSee `references/index.md` for complete feed structure.\n\n---\n\n**Generated by Skill Seeker** | RSS/Atom Feed Scraper\n","tests/golden/phase2/word/SKILL.md":"---\nname: golden-word\ndescription: Use when testing the word golden build\n---\n\n# Golden_Word Documentation Skill\n\nUse when testing the word golden build\n\n## 📋 Document Information\n\n**Title:** The Manual\n\n**Author:** John Roe\n\n**Created:** 2023-05-05\n\n**Modified:** 2024-02-02\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_word concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **manual**: 3 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 1\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/manual.md` - manual\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | Word Document Scraper\n"},"files":{".codex-plugin/plugin.json":"{\n  \"name\": \"skill-seekers\",\n  \"version\": \"3.5.0\",\n  \"description\": \"Convert docs and repos into AI skills via MCP\",\n  \"author\": {\n    \"name\": \"yusufkaraaslan\",\n    \"url\": \"https://github.com/yusufkaraaslan/Skill_Seekers\"\n  },\n  \"homepage\": \"https://skillseekersweb.com/\",\n  \"repository\": \"https://github.com/yusufkaraaslan/Skill_Seekers\",\n  \"keywords\": [\"mcp\", \"codex\", \"skills\", \"documentation\"],\n  \"mcpServers\": \"./.mcp.json\",\n  \"skills\": \"./skills/\",\n  \"interface\": {\n    \"displayName\": \"Skill Seekers\",\n    \"shortDescription\": \"Convert docs and repos into AI skills via MCP\",\n    \"longDescription\": \"Convert documentation websites, GitHub repositories, and PDFs into AI skills with automatic conflict detection.\",\n    \"category\": \"Development\",\n    \"websiteURL\": \"https://skillseekersweb.com/\"\n  }\n}\n","AGENTS.md":"# AGENTS.md - Skill Seekers\n\nComprehensive 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.\n\n## Project Overview\n\n**Skill Seekers** is a universal preprocessing layer that transforms raw documentation and code into structured knowledge assets. It supports 17+ source types and exports to 21+ AI platforms including Claude, Gemini, OpenAI, LangChain, LlamaIndex, and various vector databases.\n\n### Key Capabilities\n- **Source Types (17):** Documentation websites, GitHub repos, PDFs, Word docs, EPUBs, videos, local codebases, Jupyter notebooks, HTML, OpenAPI specs, AsciiDoc, PowerPoint, Confluence, Notion, RSS feeds, man pages, chat exports\n- **Export Targets (21):** Claude, Gemini, OpenAI, MiniMax, OpenCode, Kimi, DeepSeek, Qwen, OpenRouter, Together AI, Fireworks AI, Markdown, LangChain, LlamaIndex, Haystack, Weaviate, ChromaDB, FAISS, Qdrant, Pinecone\n- **MCP Server:** FastMCP-based Model Context Protocol server for AI assistant integration\n\n## Setup\n\n```bash\n# REQUIRED before running tests (src/ layout — tests hard-exit if package not installed)\npip install -e .\n\n# With dev tools (pytest, ruff, mypy, coverage)\npip install -e \".[dev]\"\n\n# With specific LLM platform support\npip install -e \".[gemini]\"      # Google Gemini\npip install -e \".[openai]\"      # OpenAI ChatGPT\npip install -e \".[all-llms]\"    # All LLM platforms\n\n# With all optional dependencies (except video-full)\npip install -e \".[all]\"\n\n# Full video processing (heavy dependencies)\npip install -e \".[video-full]\"\n```\n\nNote: `tests/conftest.py` checks that `skill_seekers` is importable and calls `sys.exit(1)` if not. Always install in editable mode first.\n\n### Environment Variables\n\nCreate a `.env` file or export these variables:\n```bash\nANTHROPIC_API_KEY      # For Claude AI enhancement\nGOOGLE_API_KEY         # For Gemini support\nOPENAI_API_KEY         # For OpenAI support\nGITHUB_TOKEN           # For GitHub repo scraping (higher rate limits)\n```\n\n## Build / Test / Lint\n\n```bash\n# Full suite (never skip — all must pass)\npytest tests/ -v\n\n# Fast iteration (skip slow, integration, E2E, network, MCP)\npytest tests/ -m \"not slow and not integration and not e2e and not network and not serial and not mcp_only\" -q\n\n# Fast parallel (install pytest-xdist first)\npytest 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\n\n# 3-phase runner script (recommended for local dev)\nbash scripts/run_tests_fast.sh\n\n# Single test\npytest tests/test_scraper_features.py::test_detect_language -v\n\n# Skip slow/integration\npytest tests/ -v -m \"not slow and not integration\"\n\n# With coverage\npytest tests/ --cov=src/skill_seekers --cov-report=term\n\n# Lint + format check (matches CI)\nruff check src/ tests/\nruff format --check src/ tests/\n\n# Type check (non-blocking — mypy is continue-on-error in CI)\nmypy src/skill_seekers --show-error-codes --pretty\n```\n\n**Pytest config:** `asyncio_mode = \"auto\"`, so `@pytest.mark.asyncio` is implicit. Test markers: `slow`, `integration`, `e2e`, `venv`, `bootstrap`, `benchmark`, `asyncio`, `serial`, `network`, `mcp_only`.\n\n**CI note:** CI pins `ruff==0.15.8` (not the `>=0.14.13` dev dep). If formatting behaves differently locally, check the CI version.\n\n**CI test phases:** Tests are split into 3 parallel jobs:\n- `test-fast` — 3386 unit tests with xdist across OS/Python matrix\n- `test-serial` — 69 serial/integration/E2E/network tests\n- `test-mcp` — 193 MCP tests (requires `[mcp]` extras)\n\n## Code Style\n\n### Formatting Rules (ruff — from pyproject.toml)\n- **Line length:** 100 characters\n- **Target Python:** 3.10+\n- **Enabled lint rules:** E, W, F, I, B, C4, UP, ARG, SIM\n- **Ignored rules:** E501 (line length handled by formatter), F541 (f-string style), ARG002 (unused method args for interface compliance), B007 (intentional unused loop vars), I001 (formatter handles imports), SIM114 (readability preference)\n\n### Imports\n- Sort with isort (via ruff); `skill_seekers` is first-party\n- Standard library → third-party → first-party, separated by blank lines\n- Use `from __future__ import annotations` only if needed for forward refs\n- Guard optional imports with try/except ImportError (see `adaptors/__init__.py` pattern):\n  ```python\n  try:\n      from .claude import ClaudeAdaptor\n      from .minimax import MiniMaxAdaptor\n  except ImportError:\n      ClaudeAdaptor = None\n      MiniMaxAdaptor = None\n  ```\n\n### Naming Conventions\n- **Files:** `snake_case.py` (e.g., `source_detector.py`, `config_validator.py`)\n- **Classes:** `PascalCase` (e.g., `SkillAdaptor`, `ClaudeAdaptor`, `SourceDetector`)\n- **Functions/methods:** `snake_case` (e.g., `get_adaptor()`, `detect_language()`)\n- **Constants:** `UPPER_CASE` (e.g., `ADAPTORS`, `DEFAULT_CHUNK_TOKENS`, `VALID_SOURCE_TYPES`)\n- **Private:** prefix with `_` (e.g., `_read_existing_content()`, `_validate_unified()`)\n\n### Type Hints\n- Gradual typing — add hints where practical, not enforced everywhere\n- Use modern syntax: `str | None` not `Optional[str]`, `list[str]` not `List[str]`\n- MyPy config: `disallow_untyped_defs = false`, `check_untyped_defs = true`, `ignore_missing_imports = true`\n- Tests are excluded from strict type checking (`disallow_untyped_defs = false`, `check_untyped_defs = false` for `tests.*`)\n\n### Docstrings\n- Module-level docstring on every file (triple-quoted, describes purpose)\n- Google-style docstrings for public functions/classes\n- Include `Args:`, `Returns:`, `Raises:` sections where useful\n\n### Error Handling\n- Use specific exceptions, never bare `except:`\n- Provide helpful error messages with context\n- Use `raise ValueError(...)` for invalid arguments, `raise RuntimeError(...)` for state errors\n- Guard optional dependency imports with try/except and give clear install instructions on failure\n- Chain exceptions with `raise ... from e` when wrapping\n\n### Suppressing Lint Warnings\n- Use inline `# noqa: XXXX` comments (e.g., `# noqa: F401` for re-exports, `# noqa: ARG001` for required but unused params)\n\n## Project Layout\n\n```\nsrc/skill_seekers/           # Main package (src/ layout)\n  cli/                       # CLI commands and entry points (100+ files)\n    adaptors/                # Platform adaptors (Strategy pattern, inherit SkillAdaptor)\n    arguments/               # CLI argument definitions (one per source type)\n    parsers/                 # Subcommand parsers (one per source type)\n    storage/                 # Cloud storage (inherit BaseStorageAdaptor)\n    main.py                  # Unified CLI entry point (COMMAND_MODULES dict)\n    source_detector.py       # Auto-detects source type from user input\n    create_command.py        # Unified `create` command routing\n    config_validator.py      # VALID_SOURCE_TYPES set + per-type validation\n    unified_scraper.py       # Multi-source orchestrator (scraped_data + dispatch)\n    unified_skill_builder.py # Pairwise synthesis + generic merge\n  mcp/                       # MCP server (FastMCP + legacy)\n    tools/                   # MCP tool implementations by category (10 files)\n    server_fastmcp.py        # FastMCP server implementation\n    server_legacy.py         # Legacy MCP server\n  sync/                      # Sync monitoring (Pydantic models)\n  benchmark/                 # Benchmarking framework\n  embedding/                 # FastAPI embedding server\n  workflows/                 # 67 YAML workflow presets\n  _version.py                # Reads version from pyproject.toml\ntests/                       # 160 test files (pytest)\n  test_adaptors/             # 22 adaptor-specific test files\n  conftest.py                # Test configuration with package check\nconfigs/                     # Preset JSON scraping configs\ndocs/                        # Documentation (guides, integrations, architecture)\n```\n\n## Key Patterns\n\n**Adaptor (Strategy) pattern** — all platform logic in `cli/adaptors/`. Inherit `SkillAdaptor`, implement `format_skill_md()`, `package()`, `upload()`. Register in `adaptors/__init__.py` ADAPTORS dict.\n\n**Scraper pattern** — each source type has: `cli/<type>_scraper.py` (with `<Type>ToSkillConverter` class + `main()`), `arguments/<type>.py`, `parsers/<type>_parser.py`. Register in `parsers/__init__.py` PARSERS list, `main.py` COMMAND_MODULES dict, `config_validator.py` VALID_SOURCE_TYPES set.\n\n**Unified pipeline** — `unified_scraper.py` dispatches to per-type `_scrape_<type>()` methods. `unified_skill_builder.py` uses pairwise synthesis for docs+github+pdf combos and `_generic_merge()` for all other combinations.\n\n**MCP tools** — grouped in `mcp/tools/` by category. `scrape_generic_tool` handles all new source types.\n\n**CLI subcommands** — git-style in `cli/main.py`. Each delegates to a module's `main()` function.\n\n**Supported source types (17):** documentation (web), github, pdf, local, word, video, epub, jupyter, html, openapi, asciidoc, pptx, confluence, notion, rss, manpage, chat. Each detected automatically by `source_detector.py`.\n\n**Supported platforms (21):** claude, gemini, openai, minimax, opencode, kimi, deepseek, qwen, openrouter, together, fireworks, markdown, langchain, llama-index, haystack, weaviate, chroma, faiss, qdrant, pinecone.\n\n## Web UI (Seeker HUD) — beta\n\n**Status: beta** (since 3.10.0). Screens, API routes and `~/.skill-seekers/ui/` state may change between minor releases; the CLI and MCP server are unaffected.\n\nLocal web app: React 19 + Vite + Tailwind/shadcn frontend in `ui/`, FastAPI backend in `src/skill_seekers/web/`.\n\n```bash\n# Run the app (opens browser; API on :8770)\nskill-seekers ui\n\n# Frontend dev mode (hot reload, proxies /api to :8770)\ncd ui && npm install && npm run dev\n\n# Build frontend (Vite outputs to src/skill_seekers/web/dist, which the\n# backend serves and the wheel bundles as package-data)\ncd ui && npm run build\n```\n\n- Backend deps: `pip install -e \".[ui]\"` (fastapi + uvicorn; also in `[all]` and dev group)\n- **Packaging:** the built SPA is bundled into the wheel from `src/skill_seekers/web/dist` (gitignored; the release workflow runs `npm run build` before `uv build`). `skill-seekers ui` warns if the frontend hasn't been built.\n- Jobs run as subprocesses (`python -m skill_seekers.web.runner`) with streamed logs + `[[PROGRESS:nn]]` markers\n- UI state: `~/.skill-seekers/ui/` (jobs, projects, activity, skill overrides, settings)\n- API tests: `tests/test_web_api.py`\n\n## CLI Commands\n\n```bash\n# Core commands\nskill-seekers create <source>              # Create skill from any source (auto-detects type)\nskill-seekers create <source> --index      # ...plus an opt-in SQLite search index + scripts/search.py\nskill-seekers scan <dir>                   # AI-detect a project's tech stack and emit per-framework configs\nskill-seekers enhance <directory>          # AI-powered enhancement\nskill-seekers package <directory>          # Package skill for target platform\nskill-seekers upload <file>                # Upload skill to target platform\nskill-seekers install <source>             # One-command workflow (scrape + enhance + package + upload)\n\n# Utilities\nskill-seekers estimate <source>            # Estimate page count before scraping\nskill-seekers detect <source> [--json]     # Read-only: how create would classify a source (exit 2 if invalid)\nskill-seekers doctor [--json]              # Health check for dependencies (--json for CI/agents)\nskill-seekers config                       # Configure API keys and settings\nskill-seekers workflows                    # List and apply workflow presets\nskill-seekers resume <job_id>              # Resume interrupted scraping\n\n# Advanced\nskill-seekers stream <source>              # Streaming ingestion\nskill-seekers update <directory>           # Incremental update\nskill-seekers multilang <directory>        # Multi-language support\n```\n\n## Testing Instructions\n\n### Test Structure\n- Unit tests: `tests/test_*.py` — test individual modules\n- Adaptor tests: `tests/test_adaptors/test_*_adaptor.py` — test platform adaptors\n- E2E tests: `tests/test_*_e2e.py` — end-to-end integration tests\n\n### Running Tests\n```bash\n# Fast test run (skip slow/integration tests)\npytest tests/ -v -m \"not slow and not integration\"\n\n# Full test suite\npytest tests/ -v\n\n# With coverage report\npytest tests/ --cov=src/skill_seekers --cov-report=term-missing\n\n# Specific test categories\npytest tests/ -v -m \"slow\"           # Only slow tests\npytest tests/ -v -m \"integration\"    # Only integration tests\npytest tests/ -v -m \"e2e\"            # Only E2E tests\n```\n\n### Test Fixtures\nTest fixtures are located in `tests/fixtures/` and include sample configs, HTML files, and mock data.\n\n## Git Workflow\n\n- **`main`** — production, protected\n- **`development`** — default PR target, active dev\n- Feature branches created from `development`\n\n## Pre-commit Checklist\n\n```bash\nruff check src/ tests/\nruff format --check src/ tests/\npytest tests/ -v -x   # stop on first failure\n```\n\nNever commit API keys. Use env vars: `ANTHROPIC_API_KEY`, `GOOGLE_API_KEY`, `OPENAI_API_KEY`, `GITHUB_TOKEN`.\n\n## CI/CD\n\nGitHub Actions (7 workflows in `.github/workflows/`):\n- **tests.yml** — ruff + mypy lint job, then pytest matrix (Ubuntu + macOS, Python 3.10-3.12) with Codecov upload\n- **release.yml** — tag-triggered: tests → version verification → PyPI publish via `uv build`\n- **test-vector-dbs.yml** — tests vector DB adaptors (weaviate, chroma, faiss, qdrant)\n- **docker-publish.yml** — multi-platform Docker builds (amd64, arm64) for CLI + MCP images\n- **quality-metrics.yml** — quality analysis with configurable threshold\n- **scheduled-updates.yml** — weekly skill updates for popular frameworks\n- **vector-db-export.yml** — weekly vector DB exports\n\n## Deployment\n\n### Docker\nMulti-stage Dockerfile with Python 3.12 slim base:\n```bash\n# Build CLI image\ndocker build -t skill-seekers:local -f Dockerfile .\n\n# Run CLI\ndocker run -v $(pwd)/output:/output skill-seekers:local create https://docs.example.com\n\n# Run MCP server\ndocker build -t skill-seekers-mcp:local -f Dockerfile.mcp .\ndocker run -p 8765:8765 skill-seekers-mcp:local\n```\n\n### MCP Server\nThe MCP server provides Model Context Protocol integration:\n```bash\n# Start FastMCP server\nskill-seekers-mcp\n\n# Or use the Python module\npython -m skill_seekers.mcp.server_fastmcp\n```\n\n## Security Considerations\n\n- **API Keys:** Never commit API keys to version control. Use environment variables or `.env` files (already in `.gitignore`)\n- **Docker:** Runs as non-root user (`skillseeker`, UID 1000)\n- **Dependencies:** Regular security updates via `pip audit` or `safety check`\n- **Sandboxing:** Video processing uses optional dependencies that can be heavy; install `[video-full]` only when needed\n\n## Additional Resources\n\n- **Website:** https://skillseekersweb.com/\n- **Documentation:** https://skillseekersweb.com/\n- **PyPI:** https://pypi.org/project/skill-seekers/\n- **Repository:** https://github.com/yusufkaraaslan/Skill_Seekers\n- **Config Browser:** https://skillseekersweb.com/\n- **Project Board:** https://github.com/users/yusufkaraaslan/projects/2\n","CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\n**Skill Seekers** converts documentation from 18 source types into production-ready formats for 21+ AI platforms (LLM platforms, RAG frameworks, vector databases, AI coding assistants). Published on PyPI as `skill-seekers`.\n\n**Version:** 3.11.0 (dev; last release 3.10.0) — source of truth is `src/skill_seekers/_version.py` | **Python:** 3.10+ | **Website:** https://skillseekersweb.com/\n\n**Architecture:** See `docs/UML_ARCHITECTURE.md` for UML diagrams and module overview. StarUML project at `docs/UML/skill_seekers.mdj`. Refactor state/history: `docs/UNIFICATION_PLAN.md` (Grand Unification — all 5 phases done; remaining cosmetic items listed there).\n\n## Essential Commands\n\n```bash\n# REQUIRED before running tests or CLI (src/ layout)\npip install -e .\n\n# Run all tests (NEVER skip - all must pass before commits)\npytest tests/ -v\n\n# Fast iteration (skip slow MCP tests ~20min)\npytest tests/ --ignore=tests/test_mcp_fastmcp.py --ignore=tests/test_mcp_server.py --ignore=tests/test_install_skill_e2e.py -q\n\n# Single test\npytest tests/test_scraper_features.py::test_detect_language -vv -s\n\n# Code quality (must pass before push - matches CI)\nuvx ruff check src/ tests/\nuvx ruff format --check src/ tests/\nmypy src/skill_seekers  # continue-on-error in CI\n\n# Auto-fix lint/format issues\nuvx ruff check --fix --unsafe-fixes src/ tests/\nuvx ruff format src/ tests/\n\n# Build & publish\nuv build\nuv publish\n```\n\n## CI Matrix\n\nRuns on push/PR to `main` or `development`. Lint job (Python 3.12, Ubuntu) + Test job (Ubuntu + macOS, Python 3.10/3.11/3.12, excludes macOS+3.10). Both must pass for merge.\n\n## Git Workflow\n\n- **Main branch:** `main` (requires tests + 1 review)\n- **Development branch:** `development` (default PR target, requires tests)\n- **Feature branches:** `feature/{task-id}-{description}` from `development`\n- PRs always target `development`, never `main` directly\n\n## Architecture\n\n### CLI: Unified create command\n\nEntry point `src/skill_seekers/cli/main.py`. The `create` command is the **primary** entry point for skill creation — it auto-detects source type and routes to the appropriate `SkillConverter`. The `scan` command (added in #327) is a separate discovery step for projects with multiple frameworks; it emits one config file per detected framework and you then run `create` on each.\n\n```\nskill-seekers create <source>     # Auto-detect: URL, owner/repo, ./path, file.pdf, etc.\nskill-seekers scan <dir>          # AI-driven discovery → emits one config per detected framework + <project>-codebase.json\nskill-seekers package <dir>       # Package for platform (--target claude/gemini/openai/markdown/minimax/opencode/kimi/deepseek/qwen/openrouter/together/fireworks/atlas/langchain/llama-index/haystack/chroma/faiss/weaviate/qdrant/pinecone/ibm-bob)\n```\n\n### Scan command (issue #327)\n\n`skill-seekers scan <dir>` is an AI-driven project knowledge-base bootstrapper. Pipeline in `src/skill_seekers/cli/scan_command.py`:\n\n1. `collect_signals()` in `signal_collectors.py` — deterministic, bounded gathering of manifests + README + Dockerfile/CI + sampled source files + git remote. **Per-kind byte budgets** (24 KB manifest / 6 KB README / 6 KB CI / 28 KB samples, total 64 KB) so a fat package.json can't crowd out other kinds. `_SOURCE_DIRS` covers ~14 layouts (Go `cmd/`, Rust `crates/`, JS monorepo `apps/packages/`, Maven `source/`, Django at root); also walks root one level deep for flat-layout Python.\n2. `detect_with_ai(bundle, AgentClient)` — one LLM call, structured JSON output. **Source signals are first-2-KB of each file** (whole-file sampling, no regex parsing — added in WS4 because regex missed Go multi-line imports + Rust `mod`/`extern crate`). Canonical-slug prompt + the canonical-name resolver are coupled — change one, update the other.\n3. `resolve_or_generate_with_status()` — for each detection: try `out_dir/<slug>.json` (cache from prior run), then `resolve_config_path` from `config_fetcher` with multiple canonical name candidates (`_canonical_name_candidates` handles `\"Godot Engine\"` → `\"godot\"`, plus CJK / European suffixes like `\"Godot 引擎\"`, `\"React フレームワーク\"`, `\"Lodash Bibliothek\"`), then `generate_config_with_ai` as the last resort. Always appends `.json` to lookup names so local-disk and user-dir resolution actually finds files. Always stamps `metadata.detected_version` (nested, not top-level — `metadata.version` already exists and means config-schema version).\n4. `emit_codebase_config()` — always writes `<project>-codebase.json` (a `type: local` source pointed at the project root).\n5. `diff_against_existing()` — keyed by **filename slug** (not internal `data[\"name\"]`) so re-scans don't churn when the AI returns a display name vs the registry canonical slug.\n6. `_archive_removed()` — when a config disappears from detections, MOVE (not delete — user may have hand-edited) to `out_dir/.archived/<UTC-timestamp>/`. Runs after diff, before fresh writes.\n7. `maybe_publish()` — **native async** (WS11). Opt-in submission of freshly AI-generated configs to the community registry. Pre-checks `GITHUB_TOKEN`. Idempotency guard: `_find_existing_issue` queries GitHub Search API for an existing open issue with the same config name before submitting. Retries transient failures (rate limit, 5xx) with 0s/5s/15s backoff. `_prompt_async` wraps `input()` via `asyncio.to_thread` so the event loop isn't blocked.\n\n**CLI dispatch** uses the `COMMAND_CLASSES` table in `main.py` (added in WS1). `scan` and `doctor` are dispatched as `Cls(args).execute()` consuming the parsed argparse namespace directly — no `_reconstruct_argv` hack, no duplicate argparse. `ScanCommand.execute()` is the single `asyncio.run` boundary wrapping `run_scan` (sync) + `maybe_publish` (async). Remaining ~14 commands still use the legacy `COMMAND_MODULES` dispatch; they're flagged for migration.\n\n**Cost guardrails**: `--max-ai-generations N` (default 10) caps unbounded AI generation; `--dry-run` previews without writing or invoking AI; `--probe-urls` HEAD-checks AI-generated URLs with retry-on-404 and stamps `metadata._url_unverified` on confirmed-bad URLs.\n\n**Safety**: All writes use `_atomic_write_json` (`os.replace` after writing to `.tmp`) so a `KeyboardInterrupt` mid-write can't corrupt configs. `_safe_size` guards `stat()` so broken symlinks don't crash the scan. `ScanCommand.execute` calls `logging.basicConfig` so `logger.warning`/`error` is visible; exit code is non-zero when no configs and no codebase config were emitted.\n\n**Public constant**: `SourceDetector.CODE_PROJECT_MARKERS` (was `_CODE_PROJECT_MARKERS`) — shared between source_detector + signal_collectors. ~50 manifest types now (Pipfile, environment.yml, deno.json, flake.nix, Chart.yaml, deps.edn, dune-project, BUILD.bazel, …). Public so cross-module access doesn't reach into a private attribute.\n\n### SkillConverter Pattern (Template Method + Factory)\n\nAll 18 source types implement the `SkillConverter` base class (`skill_converter.py`):\n\n```python\nconverter = get_converter(\"web\", config)  # Factory lookup\nconverter.run()  # Template: extract() → build_skill()\n```\n\nRegistry in `CONVERTER_REGISTRY` maps source type → (module, class). `create_command.py` builds config from `ExecutionContext`, calls `get_converter()`, then runs centralized enhancement. `get_converter(\"config\", {...})` constructs `UnifiedScraper` from the same factory-shaped dict (no special cases in create_command/MCP). The base resolves `skill_dir` once (strips trailing separators) and derives `data_file` via `data_file_for()` — subclasses must not re-derive paths.\n\n### DocumentSkillBuilder (build side of 9 document scrapers)\n\n`cli/document_skill_builder.py:DocumentSkillBuilder` sits between `SkillConverter` and the 9 document scrapers (epub, word, pptx, html, pdf, jupyter, man, rss, chat). It owns `categorize_content`, reference-file writing (tables, truncation, image guard), `index.md` + `SKILL.md` generation, and `load_extracted_data`. Variation points are class attrs (`DOC_NOUN`, `SOURCE_LABEL`, `LOAD_TOTAL_KEY`, `PATTERN_KEYWORDS`, `RANGE_LABEL`, …) and small hook methods (`category_stem`, `_write_reference_section`, `_write_skill_md_metadata`). Output is pinned **byte-identical** by golden trees in `tests/golden/phase2/` — `UPDATE_GOLDENS=1` rewrites them, only do that deliberately. Surviving full-method overrides are domain-shaped and commented per scraper.\n\n### UnifiedScraper (multi-source configs)\n\n`unified_scraper.py` dispatches via the class-level `SOURCE_DISPATCH` table; `_scrape_with_converter()` is the shared engine for the 13 mechanical source types (`get_converter()` + public `converter.extract()` + cache copy + sub-skill build), so **new types registered in `CONVERTER_REGISTRY` work in unified configs automatically**. documentation/github/local stay bespoke (commented why). `run()` deliberately does NOT follow the base template (TestRunOrchestration pins that run() triggers workflows).\n\n### Data Flow (5 phases)\n\n1. **Scrape** - Source-specific scraper extracts content to `output/{name}_data/pages/*.json`\n2. **Build** - `build_skill()` categorizes pages, extracts patterns, generates `output/{name}/SKILL.md`\n3. **Enhance** (optional) - LLM rewrites SKILL.md (`--enhance-level 0-3`, auto-detects API vs LOCAL mode)\n4. **Package** - Platform adaptor formats output (`.zip`, `.tar.gz`, JSON, vector index)\n5. **Upload** (optional) - Platform API upload\n\n### Platform Adaptor Pattern (Strategy + Factory)\n\nFactory: `get_adaptor(platform, config)` in `adaptors/__init__.py` returns a `SkillAdaptor` instance. Base class `SkillAdaptor` + `SkillMetadata` in `adaptors/base.py`.\n\n```\nsrc/skill_seekers/cli/adaptors/\n├── __init__.py              # Factory: get_adaptor(platform, config), ADAPTORS registry\n├── base.py                  # Abstract base: SkillAdaptor, SkillMetadata\n├── openai_compatible.py     # Shared base for OpenAI-compatible platforms\n├── claude.py                # --target claude\n├── gemini.py                # --target gemini\n├── openai.py                # --target openai\n├── markdown.py              # --target markdown\n├── minimax.py               # --target minimax\n├── opencode.py              # --target opencode\n├── kimi.py                  # --target kimi\n├── deepseek.py              # --target deepseek\n├── qwen.py                  # --target qwen\n├── openrouter.py            # --target openrouter\n├── together.py              # --target together\n├── fireworks.py             # --target fireworks\n├── langchain.py             # --target langchain\n├── llama_index.py           # --target llama-index\n├── haystack.py              # --target haystack\n├── chroma.py                # --target chroma\n├── faiss_helpers.py         # --target faiss\n├── qdrant.py                # --target qdrant\n├── weaviate.py              # --target weaviate\n├── pinecone_adaptor.py      # --target pinecone\n└── streaming_adaptor.py     # --target streaming\n```\n\nAll adaptors use `--target`. All adaptors are imported with `try/except ImportError` so missing optional deps don't break the registry.\n\n### 18 Source Type Converters\n\nEach in `src/skill_seekers/cli/{type}_scraper.py` as a `SkillConverter` subclass (no `main()`). The `create_command.py` uses `source_detector.py` to auto-detect, then calls `get_converter()`. Converters: web (doc_scraper), github, pdf, word, epub, video, local (codebase_scraper), jupyter, html, openapi, asciidoc, pptx, rss, manpage, confluence, notion, chat, config (unified_scraper).\n\n### CLI Argument System (single-definition parsers)\n\n```\nsrc/skill_seekers/cli/\n├── parsers/              # Central SubcommandParser classes — the ONLY definition of each command's flags\n│   └── create_parser.py  # Progressive help disclosure (--help-web, --help-github, etc.)\n├── arguments/            # Argument definitions\n│   ├── common.py         # add_all_standard_arguments() - shared across all scrapers\n│   └── create.py         # UNIVERSAL_ARGUMENTS, WEB_ARGUMENTS, GITHUB_ARGUMENTS, etc.\n├── exit_codes.py         # EXIT_SUCCESS/ERROR/VALIDATION/INTERRUPT\n└── source_detector.py    # Auto-detect source type from input string\n```\n\nCommand modules' standalone `main(args=None)` paths build their parser FROM the central `SubcommandParser` class — **add/change a flag in `parsers/*.py` only**. Drift guards (`tests/test_cli_parsers.py::TestCentralModuleParserSync` and `TestCentralParserSingleSource`) fail CI on any divergence of dests/defaults/option strings.\n\n`ExecutionContext.override()` is context-local (a `ContextVar` layered over the unchanged base singleton) — thread/async safe for the MCP server; propagate to worker threads via `copy_context`.\n\n### Standalone subsystems (outside `cli/`)\n\nFour top-level packages sit beside `cli/` and are largely independent of the scrape→build→package flow:\n\n- `embedding/` — FastAPI embedding-generation server (`python -m skill_seekers.embedding.server`) with a caching layer (`cache.py`) and multi-backend generators (OpenAI, sentence-transformers, Anthropic). Feeds the vector-DB adaptors.\n- `sync/` — real-time doc-sync system: `detector.py` (content-hash / last-modified change detection), `monitor.py` (scheduled incremental re-scrapes), `notifier.py` (email/Slack/webhook). Keeps generated skills fresh as upstream docs change.\n- `benchmark/` — performance suite (`runner.py`, `framework.py`) measuring scrape/embedding/storage/e2e timing, memory, and CPU; emits comparison + optimization reports.\n- `workflows/` — bundled default enhancement-workflow presets consumed by the enhancement step.\n\n### C3.x Codebase Analysis Pipeline\n\nLocal codebase analysis features, all opt-out (`--skip-*` flags):\n- C3.1 `pattern_recognizer.py` - Design pattern detection (10 GoF patterns, 9 languages)\n- C3.2 `test_example_extractor.py` - Usage examples from tests\n- C3.3 `how_to_guide_builder.py` - AI-enhanced educational guides\n- C3.4 `config_extractor.py` - Configuration pattern extraction\n- C3.5 `generate_router.py` - Architecture overview generation\n- C3.10 `signal_flow_analyzer.py` - Godot signal flow analysis\n\n### MCP Server\n\n`src/skill_seekers/mcp/server_fastmcp.py` - 40 tools via FastMCP. Transport: stdio (Claude Code) or HTTP (Cursor/Windsurf). Optional dependency: `pip install -e \".[mcp]\"`\n\n- **Tools run in-process** via `run_cli_main()` in `mcp/tools/_common.py`: same argv parsed by the command's REAL parser (sys.argv patch under a lock), stdout/stderr capture + contextvar log capture, identical `(stdout, stderr, returncode)` contract. No subprocess startup; old hard timeouts are advisory.\n- **Exceptions BY DESIGN**: `enhance_skill` (LOCAL agent) and `install_skill`'s enhancement step stay subprocess — the agent must be a real child process for the fork-bomb-guard env semantics (`SKILL_SEEKER_ENHANCE_ACTIVE`). Never make these in-process.\n- **Domain logic lives in `skill_seekers.services/`** (marketplace_manager, marketplace_publisher, config_publisher, source_manager, git_repo) — importable by CLI without the `[mcp]` extra; old `skill_seekers.mcp.*` paths are back-compat shims. No `sys.path` hacks anywhere in `mcp/`.\n\n### Seeker HUD (web UI)\n\nFastAPI backend in `src/skill_seekers/web/`, React app in `ui/`; see `docs/guides/WEB_UI.md`.\n\n- HUD routes live in `src/skill_seekers/web/routes/` (one module per screen, `register(app, ctx)`); `app.py` keeps the original routes.\n\n### Enhancement (AgentClient is the single AI transport)\n\nEvery AI call goes through `AgentClient` (`src/skill_seekers/cli/agent_client.py`): central truncation gate, timeout policy, error classification. `API_PROVIDERS` (provider registry) and `AGENT_PRESETS` (local-agent command templates) live ONLY there. Each `API_PROVIDERS` entry declares its wire `protocol` (`anthropic`/`openai`/`google`) and `supports_images` capability — `_call_api` branches on the resolved protocol, NOT the provider name, so an OpenAI/Anthropic-compatible provider needs no new branch. Adaptors declare provider/endpoint/model/prompt and route through `SkillAdaptor._enhance_skill_md_via_client` (atomic save with backup). Multimodal image input goes through `AgentClient.call_with_image()` (used by `video_visual` frame OCR across all image-capable providers); it no longer bypasses AgentClient with a direct SDK call.\n\n- **API mode** (if API key set): Anthropic, Google Gemini, OpenAI, Moonshot/Kimi, MiniMax — detected in registry order; `SKILL_SEEKER_PROVIDER` forces one. Models: `SKILL_SEEKER_MODEL` (global) or `ANTHROPIC_MODEL`/`GOOGLE_MODEL`/`OPENAI_MODEL`/`MOONSHOT_MODEL`/`MINIMAX_MODEL`; `ANTHROPIC_BASE_URL` for compatible endpoints. MiniMax adds `MINIMAX_API_REGION` (`global_en`/`cn_zh`), `MINIMAX_API_PROTOCOL` (`openai`/`anthropic`) and `MINIMAX_THINKING` (`adaptive`/`disabled`, OpenAI protocol only; validated at `AgentClient` construction). Video input (`AgentClient.call_with_video()`, MiniMax-M3 only, 50 MB cap) is registry-driven like images: `supports_video`, `video_models`, `video_max_bytes`, `thinking_modes`, `thinking_env` on the provider entry. Vision OCR provider: `SKILL_SEEKER_VISION_PROVIDER` (`auto` picks the first image-capable provider with a key).\n- **LOCAL mode** (fallback): Claude Code, Kimi Code, Codex, Copilot, OpenCode, custom agents — command built by `build_local_agent_command()`.\n- Control: `--enhance-level 0` (off) / `1` (SKILL.md only) / `2` (default, balanced) / `3` (full)\n- Agent selection: `--agent claude|codex|copilot|opencode|kimi|custom`\n\n## Key Implementation Details\n\n### Smart Categorization (`doc_scraper.py:smart_categorize()`)\n\nScores pages against category keywords: 3 points for URL match, 2 for title, 1 for content. Threshold of 2+ required. Falls back to \"other\".\n\n### Content Extraction (`doc_scraper.py`)\n\n`FALLBACK_MAIN_SELECTORS` constant + `_find_main_content()` helper handle CSS selector fallback. Links are extracted from the full page before early return (not just main content). `body` is deliberately excluded from fallbacks.\n\n### Three-Stream GitHub Architecture (`unified_codebase_analyzer.py`)\n\nStream 1: Code Analysis (AST, patterns, tests, guides). Stream 2: Documentation (README, docs/, wiki). Stream 3: Community (issues, PRs, metadata). Depth control: `basic` (1-2 min) or `c3x` (20-60 min).\n\n## Testing\n\n### Test markers (pytest.ini)\n\n```bash\npytest tests/ -v                                    # Default: fast tests only\npytest tests/ -v -m slow                            # Include slow tests (>5s)\npytest tests/ -v -m integration                     # External services required\npytest tests/ -v -m e2e                             # Resource-intensive\npytest tests/ -v -m \"not slow and not integration\"  # Fastest subset\n```\n\n### Known legitimate skips (~11)\n\n- 2: chromadb incompatible with Python 3.14 (pydantic v1)\n- 2: weaviate-client not installed\n- 2: Qdrant not running (requires docker)\n- 2: langchain/llama_index not installed\n- 3: GITHUB_TOKEN not set\n\n### sys.modules gotcha\n\n`test_swift_detection.py` deletes `skill_seekers.cli` modules from `sys.modules`. It must save and restore both `sys.modules` entries AND parent package attributes (`setattr`). See the test file for the pattern.\n\n## Dependencies\n\nCore deps include `langchain`, `llama-index`, `anthropic`, `httpx`, `PyMuPDF`, `pydantic`. Platform-specific deps are optional:\n\n```bash\npip install -e \".[mcp]\"       # MCP server\npip install -e \".[gemini]\"    # Google Gemini\npip install -e \".[openai]\"    # OpenAI\npip install -e \".[docx]\"      # Word documents\npip install -e \".[epub]\"      # EPUB books\npip install -e \".[video]\"     # Video (lightweight)\npip install -e \".[video-full]\"# Video (Whisper + visual)\npip install -e \".[jupyter]\"   # Jupyter notebooks\npip install -e \".[pptx]\"      # PowerPoint\npip install -e \".[rss]\"       # RSS/Atom feeds\npip install -e \".[confluence]\"# Confluence wiki\npip install -e \".[notion]\"    # Notion pages\npip install -e \".[chroma]\"    # ChromaDB\npip install -e \".[all]\"       # Everything (except video-full)\n```\n\nDev dependencies use PEP 735 `[dependency-groups]` in pyproject.toml.\n\n## Environment Variables\n\n```bash\nANTHROPIC_API_KEY=sk-ant-...          # Claude AI (or compatible endpoint)\nANTHROPIC_BASE_URL=https://...        # Optional: Claude-compatible API endpoint\nGOOGLE_API_KEY=AIza...                # Google Gemini (optional)\nOPENAI_API_KEY=sk-...                 # OpenAI (optional)\nGITHUB_TOKEN=ghp_...                  # Higher GitHub rate limits\n```\n\n## Adding New Features\n\n### New platform adaptor\n1. Create `src/skill_seekers/cli/adaptors/{platform}.py` inheriting `SkillAdaptor` from `base.py`\n2. Register in `adaptors/__init__.py` (add try/except import + add to `ADAPTORS` dict)\n3. Add optional dep to `pyproject.toml`\n4. Add tests in `tests/`\n\n### New source type converter\n1. Create `src/skill_seekers/cli/{type}_scraper.py` — for document-shaped sources inherit `DocumentSkillBuilder` (categorization/references/index/SKILL.md come free; implement `extract()` + hooks), otherwise inherit `SkillConverter` and implement `extract()` and `build_skill()`. Set `SOURCE_TYPE`.\n2. Register in `CONVERTER_REGISTRY` in `skill_converter.py` — this also makes the type work in unified configs automatically (UnifiedScraper engine)\n3. Add source type config building in `create_command.py:_build_config()`\n4. Add auto-detection in `source_detector.py`\n5. Add optional dep if needed\n6. Add tests\n\n### New CLI argument\n- Subcommand flag: define ONLY in the central parser class (`parsers/{cmd}_parser.py`) — module `main()` builds from it; the drift-guard test fails otherwise\n- Universal: `UNIVERSAL_ARGUMENTS` in `arguments/create.py`\n- Source-specific: appropriate dict (`WEB_ARGUMENTS`, `GITHUB_ARGUMENTS`, etc.)\n- Shared across scrapers: `add_all_standard_arguments()` in `arguments/common.py`\n","distribution/claude-plugin/.claude-plugin/plugin.json":"{\n  \"name\": \"skill-seekers\",\n  \"description\": \"Transform 18 source types (docs, GitHub, PDFs, videos, Jupyter, Confluence, Notion, Slack, and more) into AI-ready skills and RAG knowledge for 21+ AI platforms.\",\n  \"version\": \"3.9.1\",\n  \"author\": {\n    \"name\": \"Yusuf Karaaslan\"\n  },\n  \"homepage\": \"https://github.com/yusufkaraaslan/Skill_Seekers\",\n  \"repository\": \"https://github.com/yusufkaraaslan/Skill_Seekers\",\n  \"license\": \"MIT\"\n}\n","distribution/claude-plugin/commands/create-skill.md":"---\ndescription: Create an AI skill from any source (URL, repo, PDF, video, notebook, etc.)\n---\n\n# Create Skill\n\nCreate an AI-ready skill from a source. The source type is auto-detected.\n\n## Usage\n\n```\n/skill-seekers:create-skill <source> [--preset <level>] [--output <dir>]\n```\n\n## Instructions\n\nWhen the user provides a source via `$ARGUMENTS`, run the `skill-seekers create` command to generate a skill.\n\n1. Parse the arguments: extract the source (first argument) and any flags.\n2. If no `--preset` is specified, default to `quick` for fast results.\n3. If no `--output` is specified, default to `./output`.\n4. Run the create command:\n   ```bash\n   skill-seekers create \"$SOURCE\" --preset quick --output \"$OUTPUT\"\n   ```\n5. After completion, read the generated `SKILL.md` and summarize what was created.\n6. If the user wants to target a specific platform (e.g., Claude, OpenAI, LangChain), run the package command after:\n   ```bash\n   skill-seekers package \"$SKILL_DIR\" --target \"$PLATFORM\"\n   ```\n\n## Presets\n\n- `-p quick` — 1-2 minutes, basic skill\n- `-p standard` — 5-10 minutes, good coverage\n- `-p comprehensive` — 20-60 minutes, full analysis\n\n## Source Types (auto-detected)\n\n- **URL** (https://...) — Documentation scraping\n- **owner/repo** or github.com URL — GitHub repo analysis\n- **file.pdf** — PDF extraction\n- **file.ipynb** — Jupyter notebook\n- **file.docx** — Word document\n- **file.epub** — EPUB book\n- **YouTube/Vimeo URL** — Video transcript\n- **./directory** — Local codebase analysis\n- **file.yaml** with OpenAPI — API spec\n- **file.pptx** — PowerPoint\n- **file.adoc** — AsciiDoc\n- **file.html** — HTML page\n- **file.rss** — RSS/Atom feed\n- **cmd.1** — Man page\n\n## Examples\n\n```\n/skill-seekers:create-skill https://react.dev\n/skill-seekers:create-skill pallets/flask -p standard\n/skill-seekers:create-skill ./docs/api.pdf\n/skill-seekers:create-skill https://youtube.com/watch?v=abc123\n```\n","distribution/claude-plugin/commands/install-skill.md":"---\ndescription: One-command skill creation and packaging for a target platform\n---\n\n# Install Skill\n\nEnd-to-end workflow: create a skill from any source, then package it for a target LLM platform.\n\n## Usage\n\n```\n/skill-seekers:install-skill <source> [--target <platform>] [--preset <level>]\n```\n\n## Instructions\n\nWhen the user provides a source via `$ARGUMENTS`:\n\n1. Parse the arguments: extract source, `--target` (default: claude), `--preset` (default: quick).\n2. Run the create command:\n   ```bash\n   skill-seekers create \"$SOURCE\" --preset \"$PRESET\" --output ./output\n   ```\n3. Find the generated skill directory (look for the directory containing SKILL.md in ./output/).\n4. Run the package command for the target platform:\n   ```bash\n   skill-seekers package \"$SKILL_DIR\" --target \"$TARGET\"\n   ```\n5. Report what was created and where to find the packaged output.\n\n## Target Platforms\n\n`claude` (default), `openai`, `gemini`, `langchain`, `llama-index`, `haystack`, `markdown`, `chroma`, `weaviate`, `faiss`, `qdrant`, `pinecone`, `deepseek`, `kimi`, `qwen`, `fireworks`, `openrouter`, `together`, `minimax`, `opencode`, `ibm-bob`\n\n> **IDE-specific installs** (`cursor`, `windsurf`, `continue`, `cline`) are not standalone `--target` values. Use `skill-seekers install-agent` or manually copy the output from `--target markdown` or `--target claude`.\n\n## Examples\n\n```\n/skill-seekers:install-skill https://react.dev --target claude\n/skill-seekers:install-skill pallets/flask --target langchain -p standard\n/skill-seekers:install-skill ./docs/api.pdf --target openai\n```\n","distribution/claude-plugin/skills/skill-builder/SKILL.md":"---\nname: skill-builder\ndescription: Automatically detect source types and build AI skills using Skill Seekers. Use when the user wants to create skills from documentation, repos, PDFs, videos, or other knowledge sources.\n---\n\n# Skill Builder\n\nThis skill uses the Skill Seekers MCP server, which provides 40 tools for converting knowledge sources into AI-ready skills. If the MCP tools are not available, use the CLI fallback at the bottom of this file instead — do not stop.\n\n## Prerequisites\n\nThe MCP tools below only work when the Skill Seekers MCP server is connected:\n\n1. Install the package: `pip install \"skill-seekers[mcp]\"`\n2. Connect the server:\n   - Installed as the Skill Seekers plugin? Nothing to do — the plugin's bundled `.mcp.json` starts the server automatically (it still needs step 1).\n   - Installed standalone (e.g. copied into `~/.claude/skills/`)? Register the server once: `claude mcp add skill-seekers -- python -m skill_seekers.mcp.server_fastmcp`\n\nIf tools like `scrape_docs` or `package_skill` are not in your tool list, the server is not connected. Tell the user about the two steps above, and use the CLI fallback in the meantime.\n\n## When to Use This Skill\n\nUse this skill when the user:\n- Wants to create an AI skill from a documentation site, GitHub repo, PDF, video, or other source\n- Needs to convert documentation into a format suitable for LLM consumption\n- Wants to update or sync existing skills with their source documentation\n- Needs to export skills to vector databases (Weaviate, Chroma, FAISS, Qdrant)\n- Asks about scraping, converting, or packaging documentation for AI\n\n## Source Type Detection\n\nAutomatically detect the source type from user input:\n\n| Input Pattern | Source Type | Tool to Use |\n|---------------|-------------|-------------|\n| `https://...` (not GitHub/YouTube) | Documentation | `scrape_docs` |\n| `owner/repo` or `github.com/...` | GitHub | `scrape_github` |\n| `*.pdf` | PDF | `scrape_pdf` |\n| YouTube/Vimeo URL or video file | Video | `scrape_video` |\n| Local directory path | Codebase | `scrape_codebase` |\n| `*.ipynb`, `*.html`, `*.yaml` (OpenAPI), `*.adoc`, `*.pptx`, `*.rss`, `*.1`-`.8` | Various | `scrape_generic` |\n| JSON config file | Unified | Use config with `scrape_docs` |\n\n## Recommended Workflow\n\n1. **Detect source type** from the user's input\n2. **Generate or fetch config** using `generate_config` or `fetch_config` if needed\n3. **Estimate scope** with `estimate_pages` for documentation sites\n4. **Scrape the source** using the appropriate scraping tool\n5. **Enhance** with `enhance_skill` if the user wants AI-powered improvements\n6. **Package** with `package_skill` for the target platform\n7. **Export to vector DB** if requested using `export_to_*` tools\n\n## Available MCP Tools\n\n### Config Management\n- `generate_config` — Generate a scraping config from a URL\n- `list_configs` — List available preset configs\n- `validate_config` — Validate a config file\n\n### Scraping (use based on source type)\n- `scrape_docs` — Documentation sites\n- `scrape_github` — GitHub repositories\n- `scrape_pdf` — PDF files\n- `scrape_video` — Video transcripts\n- `scrape_codebase` — Local code analysis\n- `scrape_generic` — Jupyter, HTML, OpenAPI, AsciiDoc, PPTX, RSS, manpage, Confluence, Notion, chat\n\n### Post-processing\n- `enhance_skill` — AI-powered skill enhancement\n- `package_skill` — Package for target platform\n- `upload_skill` — Upload to platform API\n- `install_skill` — End-to-end install workflow\n\n### Advanced\n- `detect_patterns` — Design pattern detection in code\n- `extract_test_examples` — Extract usage examples from tests\n- `build_how_to_guides` — Generate how-to guides from tests\n- `split_config` — Split large configs into focused skills\n- `export_to_weaviate`, `export_to_chroma`, `export_to_faiss`, `export_to_qdrant` — Vector DB export\n\n## CLI Fallback (MCP server not connected)\n\nThe same pipeline is available from the command line (requires `pip install skill-seekers`). Run it with the Bash tool:\n\n```bash\nskill-seekers create <source>                      # auto-detects: URL, owner/repo, ./path, file.pdf, video URL, ...\nskill-seekers package <skill_dir> --target claude  # or gemini/openai/langchain/chroma/...\n```\n\n`create` covers detection, scraping, and building in one step; add `--enhance-level 0` to skip AI enhancement. After it finishes, read the generated `SKILL.md` and summarize what was created.\n","docs/ARCHITECTURE.md":"# Documentation Architecture\n\n> **How Skill Seekers documentation is organized (v3.6.0 - 18 source types)**\n\n---\n\n## Philosophy\n\nOur documentation follows these principles:\n\n1. **Progressive Disclosure** - Start simple, add complexity as needed\n2. **Task-Oriented** - Organized by what users want to do\n3. **Single Source of Truth** - One authoritative reference per topic\n4. **Version Current** - Always reflect the latest release\n\n---\n\n## Directory Structure\n\n```\ndocs/\n├── README.md              # Entry point - navigation hub\n├── ARCHITECTURE.md        # This file\n│\n├── getting-started/       # New users (lowest cognitive load)\n│   ├── 01-installation.md\n│   ├── 02-quick-start.md\n│   ├── 03-your-first-skill.md\n│   └── 04-next-steps.md\n│\n├── user-guide/            # Common tasks (practical focus)\n│   ├── 01-core-concepts.md\n│   ├── 02-scraping.md\n│   ├── 03-enhancement.md\n│   ├── 04-packaging.md\n│   ├── 05-workflows.md\n│   └── 06-troubleshooting.md\n│\n├── reference/             # Technical details (comprehensive)\n│   ├── CLI_REFERENCE.md\n│   ├── MCP_REFERENCE.md\n│   ├── CONFIG_FORMAT.md\n│   └── ENVIRONMENT_VARIABLES.md\n│\n└── advanced/              # Power users (specialized)\n    ├── mcp-server.md\n    ├── mcp-tools.md\n    ├── custom-workflows.md\n    └── multi-source.md\n```\n\n---\n\n## Category Guidelines\n\n### Getting Started\n\n**Purpose:** Get new users to their first success quickly\n\n**Characteristics:**\n- Minimal prerequisites\n- Step-by-step instructions\n- Copy-paste ready commands\n- Screenshots/output examples\n\n**Files:**\n- `01-installation.md` - Install the tool\n- `02-quick-start.md` - 3 commands to first skill\n- `03-your-first-skill.md` - Complete walkthrough\n- `04-next-steps.md` - Where to go after first success\n\n---\n\n### User Guide\n\n**Purpose:** Teach common tasks and concepts\n\n**Characteristics:**\n- Task-oriented\n- Practical examples\n- Best practices\n- Common patterns\n\n**Files:**\n- `01-core-concepts.md` - How it works\n- `02-scraping.md` - All 18 source types (docs, GitHub, PDF, video, Word, EPUB, Jupyter, HTML, OpenAPI, AsciiDoc, PPTX, RSS, man pages, Confluence, Notion, Slack/Discord, local codebase)\n- `03-enhancement.md` - AI enhancement\n- `04-packaging.md` - Platform export\n- `05-workflows.md` - Workflow presets\n- `06-troubleshooting.md` - Problem solving\n\n---\n\n### Reference\n\n**Purpose:** Authoritative technical information\n\n**Characteristics:**\n- Comprehensive\n- Precise\n- Organized for lookup\n- Always accurate\n\n**Files:**\n- `CLI_REFERENCE.md` - All CLI commands (including 17 source-type subcommands)\n- `MCP_REFERENCE.md` - 40 MCP tools\n- `CONFIG_FORMAT.md` - JSON schema (covers all 18 source types)\n- `ENVIRONMENT_VARIABLES.md` - All env vars (including Confluence, Notion, Slack tokens)\n\n---\n\n### Advanced\n\n**Purpose:** Specialized topics for power users\n\n**Characteristics:**\n- Assumes basic knowledge\n- Deep dives\n- Complex scenarios\n- Integration topics\n\n**Files:**\n- `mcp-server.md` - MCP server setup\n- `mcp-tools.md` - Advanced MCP usage\n- `custom-workflows.md` - Creating workflows\n- `multi-source.md` - Unified scraping\n\n---\n\n## Naming Conventions\n\n### Files\n\n- **getting-started:** `01-topic.md` (numbered for order)\n- **user-guide:** `01-topic.md` (numbered for order)\n- **reference:** `TOPIC_REFERENCE.md` (uppercase, descriptive)\n- **advanced:** `topic.md` (lowercase, specific)\n\n### Headers\n\n- H1: Title with version\n- H2: Major sections\n- H3: Subsections\n- H4: Details\n\nExample:\n```markdown\n# Topic Guide\n\n> **Skill Seekers v3.9.0**\n\n## Major Section\n\n### Subsection\n\n#### Detail\n```\n\n---\n\n## Cross-References\n\nLink to related docs using relative paths:\n\n```markdown\n<!-- Within same directory -->\nSee [Troubleshooting](user-guide/06-troubleshooting.md)\n\n<!-- Up one directory, then into reference -->\nSee [CLI Reference](reference/CLI_REFERENCE.md)\n\n<!-- Up two directories (to root) -->\nSee [Contributing](../CONTRIBUTING.md)\n```\n\n---\n\n## Maintenance\n\n### Keeping Docs Current\n\n1. **Update with code changes** - Docs must match implementation\n2. **Version in header** - Keep version current\n3. **Last updated date** - Track freshness\n4. **Deprecate old files** - Don't delete, redirect\n\n### Review Checklist\n\nBefore committing docs:\n\n- [ ] Commands actually work (tested)\n- [ ] No phantom commands documented\n- [ ] Links work\n- [ ] Version number correct\n- [ ] Date updated\n\n---\n\n## Adding New Documentation\n\n### New User Guide\n\n1. Add to `user-guide/` with next number\n2. Update `docs/README.md` navigation\n3. Add to table of contents\n4. Link from related guides\n\n### New Reference\n\n1. Add to `reference/` with `_REFERENCE` suffix\n2. Update `docs/README.md` navigation\n3. Link from user guides\n4. Add to troubleshooting if relevant\n\n### New Advanced Topic\n\n1. Add to `advanced/` with descriptive name\n2. Update `docs/README.md` navigation\n3. Link from appropriate user guide\n\n---\n\n## Deprecation Strategy\n\nWhen content becomes outdated:\n\n1. **Don't delete immediately** - Breaks external links\n2. **Add deprecation notice**:\n   ```markdown\n   > ⚠️ **DEPRECATED**: This document is outdated.\n   > See [New Guide](path/to/new.md) for current information.\n   ```\n3. **Move to archive** after 6 months:\n   ```\n   docs/archive/legacy/\n   ```\n4. **Update navigation** to remove deprecated links\n\n---\n\n## Contributing\n\n### Doc Changes\n\n1. Edit relevant file\n2. Test all commands\n3. Update version/date\n4. Submit PR\n\n### New Doc\n\n1. Choose appropriate category\n2. Follow naming conventions\n3. Add to README.md\n4. Cross-link related docs\n\n---\n\n## See Also\n\n- [Docs README](README.md) - Navigation hub\n- [Contributing Guide](../CONTRIBUTING.md) - How to contribute\n- [Repository README](../README.md) - Project overview\n","docs/agents/plans/2026-03-14-epub-input-support.md":"---\ndate: 2026-03-14T19:30:35.172407+00:00\ngit_commit: 7c90a4b9c9bccac8341b0769550d77aae3b4e524\nbranch: development\ntopic: \"Add EPUB Input Support\"\ntags: [plan, epub, scraper, input-format]\nstatus: complete\n---\n\n> 🗄️ **Historical — completed** — This plan was fully executed. EPUB input support is live in Skill Seekers v3.6.0 (`epub_scraper.py`, `arguments/epub.py`, `parsers/epub_parser.py`, 107+ tests).\n\n# Add EPUB Input Support — Implementation Plan\n\n## Overview\n\nAdd `.epub` as an input format for Skill Seekers, enabling `skill-seekers create book.epub` and `skill-seekers epub --epub book.epub`. Follows the established Word/PDF scraper pattern: source detection → routing → extraction → categorize → build skill.\n\n**Authoritative reference**: [W3C EPUB 3.3 Specification](https://www.w3.org/TR/epub-33/) (also covers EPUB 2 backward compatibility).\n\n## Current State Analysis\n\nThe codebase has a consistent multi-layer architecture for document input formats. PDF and Word (.docx) serve as direct analogs. The Word scraper (`word_scraper.py`) is the closest pattern match since both Word and EPUB produce HTML/XHTML that is parsed with BeautifulSoup.\n\n### Key Discoveries:\n- Word scraper converts `.docx` → HTML (via mammoth) → BeautifulSoup parse → intermediate JSON → SKILL.md (`word_scraper.py:96-235`)\n- EPUB files contain XHTML natively (per W3C spec §5), so the mammoth conversion step is unnecessary — BeautifulSoup can parse EPUB XHTML content directly\n- Source detection uses file extension matching (`source_detector.py:57-65`)\n- Optional dependencies use a guard pattern with `try/except ImportError` and a `_check_*_deps()` function (`word_scraper.py:21-40`)\n- The `ebooklib` library (v0.18+) provides `epub.read_epub()` returning an `EpubBook` with spine iteration, metadata access via `get_metadata('DC', key)`, and item content via `get_content()`/`get_body_content()`\n- ebooklib has a known bug: EPUB 3 files read TOC from NCX instead of NAV (issue #200); workaround: `options={\"ignore_ncx\": True}`\n- ebooklib loads entire EPUB into memory — acceptable for typical books but relevant for edge cases\n\n## Desired End State\n\nRunning `skill-seekers create book.epub` produces:\n```\noutput/book/\n├── SKILL.md              # Main skill file with metadata, concepts, code examples\n├── references/\n│   ├── index.md          # Category index with statistics\n│   └── book.md           # Chapter content (or multiple files if categorized)\n├── scripts/\n└── assets/\n    └── *.png|*.jpg       # Extracted images\n```\n\n### CLI Output Mockup\n\n```\n$ skill-seekers create programming-rust.epub\n\nℹ️  Detected source type: epub\nℹ️  Routing to epub scraper...\n\n🔍 Extracting from EPUB: programming-rust.epub\n   Title: Programming Rust, 2nd Edition\n   Author: Jim Blandy, Jason Orendorff\n   Language: en\n   Chapters: 23 (spine items)\n\n📄 Processing chapters...\n   Chapter 1/23: Why Rust? (2 sections, 1 code block)\n   Chapter 2/23: A Tour of Rust (5 sections, 12 code blocks)\n   ...\n   Chapter 23/23: Macros (4 sections, 8 code blocks)\n\n📊 Extraction complete:\n   Sections: 142\n   Code blocks: 287 (Rust: 245, Shell: 28, TOML: 14)\n   Images: 34\n   Tables: 12\n\n💾 Saved extracted data to: output/programming-rust_extracted.json\n\n📋 Categorizing content...\n✅ Created 1 category (single EPUB source)\n   - programming-rust: 142 sections\n\n📝 Generating reference files...\n   Generated: output/programming-rust/references/programming-rust.md\n   Generated: output/programming-rust/references/index.md\n\n✅ Skill built successfully: output/programming-rust/\n\n📦 Next step: Package with: skill-seekers package output/programming-rust/\n```\n\n### Verification:\n- [x] `skill-seekers create book.epub` produces valid output directory\n- [x] `skill-seekers create book.epub --name mybook` works standalone\n- [x] `skill-seekers create book.epub --dry-run` shows config without processing\n- [x] All ~2,540+ existing tests still pass (982 passed, 1 pre-existing failure)\n- [x] New test suite has 100+ tests covering happy path, errors, and edge cases (107 tests, 14 classes)\n\n## What We're NOT Doing\n\n- DRM decryption (detect and error gracefully with clear message)\n- EPUB writing/creation (read-only)\n- Media overlay / audio / video extraction (ignore gracefully)\n- Fixed-layout OCR (detect and warn; extract whatever text exists in XHTML)\n- `--chapter-range` flag (can be added later)\n- Unified scraper (`unified_scraper.py`) EPUB support (separate future task)\n- MCP tool for EPUB (separate future task)\n\n## Implementation Approach\n\nFollow the Word scraper pattern exactly, with EPUB-specific extraction logic:\n\n1. **Phase 1**: Core `epub_scraper.py` — the `EpubToSkillConverter` class\n2. **Phase 2**: CLI integration — source detection, arguments, parser, routing, entry points\n3. **Phase 3**: Comprehensive test suite — 100+ tests across 11 test classes\n4. **Phase 4**: Documentation updates\n\n---\n\n## Phase 1: Core EPUB Scraper\n\n### Overview\nCreate `epub_scraper.py` with `EpubToSkillConverter` class following the Word scraper pattern. This is the bulk of new code.\n\n### Changes Required:\n\n#### [x] 1. Optional dependency in pyproject.toml\n**File**: `pyproject.toml`\n**Changes**: Add `epub` optional dependency group and include in `all` group\n\n```toml\n# After the docx group (~line 115)\n# EPUB (.epub) support\nepub = [\n    \"ebooklib>=0.18\",\n]\n```\n\nAdd `\"ebooklib>=0.18\",` to the `all` group (~line 178).\n\n#### [x] 2. Create `src/skill_seekers/cli/epub_scraper.py`\n**File**: `src/skill_seekers/cli/epub_scraper.py` (new)\n**Changes**: Full EPUB scraper module\n\n**Structure** (following `word_scraper.py` pattern):\n\n```python\n\"\"\"\nEPUB Documentation to Skill Converter\n\nConverts EPUB e-books into skills.\nUses ebooklib for EPUB parsing, BeautifulSoup for XHTML content extraction.\n\nUsage:\n    skill-seekers create book.epub --name myskill\n    skill-seekers create book_extracted.json\n\"\"\"\n\nimport argparse\nimport json\nimport logging\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n# Optional dependency guard\ntry:\n    import ebooklib\n    from ebooklib import epub\n    EPUB_AVAILABLE = True\nexcept ImportError:\n    EPUB_AVAILABLE = False\n\n# BeautifulSoup is a core dependency (always available)\nfrom bs4 import BeautifulSoup, Comment\n\nlogger = logging.getLogger(__name__)\n\n\ndef _check_epub_deps():\n    \"\"\"Raise RuntimeError if ebooklib is not installed.\"\"\"\n    if not EPUB_AVAILABLE:\n        raise RuntimeError(\n            \"ebooklib is required for EPUB support.\\n\"\n            'Install with: pip install \"skill-seekers[epub]\"\\n'\n            \"Or: pip install ebooklib\"\n        )\n\n\ndef infer_description_from_epub(metadata: dict | None = None, name: str = \"\") -> str:\n    \"\"\"Infer skill description from EPUB metadata.\"\"\"\n    if metadata:\n        if metadata.get(\"description\") and len(metadata[\"description\"]) > 20:\n            desc = metadata[\"description\"].strip()\n            if len(desc) > 150:\n                desc = desc[:147] + \"...\"\n            return f\"Use when {desc.lower()}\"\n        if metadata.get(\"title\") and len(metadata[\"title\"]) > 10:\n            return f\"Use when working with {metadata['title'].lower()}\"\n    return (\n        f\"Use when referencing {name} documentation\"\n        if name\n        else \"Use when referencing this documentation\"\n    )\n```\n\n**`EpubToSkillConverter` class methods:**\n\n```python\nclass EpubToSkillConverter:\n    def __init__(self, config: dict):\n        self.config = config\n        self.name = config[\"name\"]\n        self.epub_path = config.get(\"epub_path\", \"\")\n        self.description = config.get(\n            \"description\", f\"Use when referencing {self.name} documentation\"\n        )\n        self.skill_dir = f\"output/{self.name}\"\n        self.data_file = f\"output/{self.name}_extracted.json\"\n        self.categories = config.get(\"categories\", {})\n        self.extracted_data = None\n\n    def extract_epub(self) -> bool:\n        \"\"\"Extract content from EPUB file.\n\n        Workflow:\n        1. Check dependencies (ebooklib)\n        2. Detect DRM via META-INF/encryption.xml (fail fast)\n        3. Read EPUB via ebooklib with ignore_ncx=True (EPUB 3 TOC bug workaround)\n        4. Extract Dublin Core metadata (title, creator, language, publisher, date, description, subject)\n        5. Iterate spine items in reading order\n        6. For each ITEM_DOCUMENT: parse XHTML with BeautifulSoup\n        7. Split by h1/h2 heading boundaries into sections\n        8. Extract code blocks from <pre>/<code> elements\n        9. Extract images from EpubImage items\n        10. Detect code languages via LanguageDetector\n        11. Save intermediate JSON to {name}_extracted.json\n\n        Returns True on success.\n        Raises RuntimeError for DRM-protected files.\n        Raises FileNotFoundError for missing files.\n        Raises ValueError for invalid EPUB files.\n        \"\"\"\n```\n\n**DRM detection** (per W3C spec §4.2.6.3.2):\n\n```python\ndef _detect_drm(self, book) -> bool:\n    \"\"\"Detect DRM by checking for encryption.xml with non-font-obfuscation entries.\n\n    Per W3C EPUB 3.3 spec: encryption.xml is present when resources are encrypted.\n    Font obfuscation (IDPF algorithm http://www.idpf.org/2008/embedding or\n    Adobe algorithm http://ns.adobe.com/pdf/enc#RC) is NOT DRM — only font mangling.\n\n    Actual DRM uses algorithms like:\n    - Adobe ADEPT: http://ns.adobe.com/adept namespace\n    - Apple FairPlay: http://itunes.apple.com/dataenc\n    - Readium LCP: http://readium.org/2014/01/lcp\n    \"\"\"\n```\n\n**Metadata extraction** (per W3C spec §5.2, Dublin Core):\n\n```python\ndef _extract_metadata(self, book) -> dict:\n    \"\"\"Extract Dublin Core metadata from EPUB.\n\n    Per W3C EPUB 3.3 spec: required elements are dc:identifier, dc:title, dc:language.\n    Optional: dc:creator, dc:contributor, dc:date, dc:description, dc:publisher,\n    dc:subject, dc:rights, dc:type, dc:coverage, dc:source, dc:relation, dc:format.\n\n    ebooklib API: book.get_metadata('DC', key) returns list of (value, attrs) tuples.\n    \"\"\"\n    def _get_one(key):\n        data = book.get_metadata('DC', key)\n        return data[0][0] if data else None\n\n    def _get_list(key):\n        data = book.get_metadata('DC', key)\n        return [x[0] for x in data] if data else []\n\n    return {\n        \"title\": _get_one('title') or \"Untitled\",\n        \"author\": \", \".join(_get_list('creator')) or None,\n        \"language\": _get_one('language') or \"en\",\n        \"publisher\": _get_one('publisher'),\n        \"date\": _get_one('date'),\n        \"description\": _get_one('description'),\n        \"subject\": \", \".join(_get_list('subject')) or None,\n        \"rights\": _get_one('rights'),\n        \"identifier\": _get_one('identifier'),\n    }\n```\n\n**Content extraction** (per W3C spec §5 — XHTML Content Documents use XML serialization of HTML5):\n\n```python\ndef _extract_spine_content(self, book) -> list[dict]:\n    \"\"\"Extract content from spine items in reading order.\n\n    Per W3C EPUB 3.3 spec §3.4.8: spine defines ordered list of content documents.\n    Linear=\"yes\" (default) items form the primary reading order.\n    Linear=\"no\" items are auxiliary (footnotes, glossary).\n\n    Per spec §5: XHTML content documents use XML syntax of HTML5.\n    Parse with BeautifulSoup, split by h1/h2 heading boundaries.\n    \"\"\"\n    sections = []\n    section_number = 0\n\n    for item_id, linear in book.spine:\n        item = book.get_item_with_id(item_id)\n        if not item or item.get_type() != ebooklib.ITEM_DOCUMENT:\n            continue\n\n        soup = BeautifulSoup(item.get_content(), 'html.parser')\n\n        # Remove scripts, styles, comments (not useful for text extraction)\n        for tag in soup(['script', 'style']):\n            tag.decompose()\n        for comment in soup.find_all(string=lambda t: isinstance(t, Comment)):\n            comment.extract()\n\n        body = soup.find('body')\n        if not body:\n            continue\n\n        # Split by h1/h2 heading boundaries (same as word_scraper)\n        # Each heading starts a new section\n        ...\n```\n\n**Image extraction** (per W3C spec §3.3 — core media types include JPEG, PNG, GIF, WebP, SVG):\n\n```python\ndef _extract_images(self, book) -> list[dict]:\n    \"\"\"Extract images from EPUB manifest.\n\n    Per W3C EPUB 3.3 spec §3.3: core image media types are\n    image/gif, image/jpeg, image/png, image/svg+xml, image/webp.\n\n    ebooklib API: book.get_items_of_type(ebooklib.ITEM_IMAGE)\n    returns EpubImage items with get_content() (bytes) and media_type.\n\n    SVG images (ITEM_VECTOR) handled separately.\n    \"\"\"\n```\n\n**The remaining methods** (`categorize_content`, `build_skill`, `_generate_reference_file`, `_generate_index`, `_generate_skill_md`, `_format_key_concepts`, `_format_patterns_from_content`, `_sanitize_filename`) follow the Word scraper pattern exactly — they operate on the same intermediate JSON structure.\n\n**`main()` function** (following `word_scraper.py:923-1059`):\n\n```python\ndef main():\n    from .arguments.epub import add_epub_arguments\n\n    parser = argparse.ArgumentParser(\n        description=\"Convert EPUB e-book to skill\",\n        formatter_class=argparse.RawDescriptionHelpFormatter,\n    )\n    add_epub_arguments(parser)\n    args = parser.parse_args()\n\n    # Logging setup\n    if getattr(args, \"quiet\", False):\n        logging.getLogger().setLevel(logging.WARNING)\n    elif getattr(args, \"verbose\", False):\n        logging.getLogger().setLevel(logging.DEBUG)\n\n    # Dry run\n    if getattr(args, \"dry_run\", False):\n        source = args.epub or args.from_json or \"(none)\"\n        print(f\"\\n{'=' * 60}\")\n        print(\"DRY RUN: EPUB Extraction\")\n        print(f\"{'=' * 60}\")\n        print(f\"Source:         {source}\")\n        print(f\"Name:           {getattr(args, 'name', None) or '(auto-detect)'}\")\n        print(f\"Enhance level:  {getattr(args, 'enhance_level', 0)}\")\n        print(f\"\\n✅ Dry run complete\")\n        return\n\n    # Validate inputs\n    if not (args.epub or args.from_json):\n        parser.error(\"Must specify --epub or --from-json\")\n\n    # From-JSON workflow\n    if args.from_json:\n        name = Path(args.from_json).stem.replace(\"_extracted\", \"\")\n        config = {\n            \"name\": name,\n            \"description\": args.description or f\"Use when referencing {name} documentation\",\n        }\n        converter = EpubToSkillConverter(config)\n        converter.load_extracted_data(args.from_json)\n        converter.build_skill()\n        return\n\n    # Direct EPUB workflow\n    name = args.name or Path(args.epub).stem\n    config = {\n        \"name\": name,\n        \"epub_path\": args.epub,\n        \"description\": args.description or f\"Use when referencing {name} documentation\",\n    }\n\n    try:\n        converter = EpubToSkillConverter(config)\n        if not converter.extract_epub():\n            print(\"\\n❌ EPUB extraction failed\", file=sys.stderr)\n            sys.exit(1)\n        converter.build_skill()\n\n        # Enhancement workflow integration\n        from skill_seekers.cli.workflow_runner import run_workflows\n        run_workflows(args)\n\n        # Traditional enhancement\n        if getattr(args, \"enhance_level\", 0) > 0:\n            # Same pattern as word_scraper.py and pdf_scraper.py\n            ...\n\n    except RuntimeError as e:\n        print(f\"\\n❌ Error: {e}\", file=sys.stderr)\n        sys.exit(1)\n```\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `ruff check src/skill_seekers/cli/epub_scraper.py` passes\n- [x] `ruff format --check src/skill_seekers/cli/epub_scraper.py` passes\n- [ ] `mypy src/skill_seekers/cli/epub_scraper.py` passes (continue-on-error)\n- [x] `pip install -e \".[epub]\"` installs successfully\n\n#### Manual Verification:\n- [x] Verify `import ebooklib` works after install\n- [x] Review epub_scraper.py structure matches word_scraper.py pattern\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding to the next phase.\n\n---\n\n## Phase 2: CLI Integration\n\n### Overview\nWire the EPUB scraper into the CLI: source detection, argument definitions, parser registration, create command routing, and entry points.\n\n### Changes Required:\n\n#### [x] 1. Source detection\n**File**: `src/skill_seekers/cli/source_detector.py`\n**Changes**: Add `.epub` extension detection, `_detect_epub()` method, validation, and error message update\n\nAdd after the `.docx` check (line 64):\n```python\nif source.endswith(\".epub\"):\n    return cls._detect_epub(source)\n```\n\nAdd `_detect_epub()` method (following `_detect_word()` at line 124):\n```python\n@classmethod\ndef _detect_epub(cls, source: str) -> SourceInfo:\n    \"\"\"Detect EPUB file source.\"\"\"\n    name = os.path.splitext(os.path.basename(source))[0]\n    return SourceInfo(\n        type=\"epub\", parsed={\"file_path\": source}, suggested_name=name, raw_input=source\n    )\n```\n\nAdd epub validation in `validate_source()` (after word block at line 278):\n```python\nelif source_info.type == \"epub\":\n    file_path = source_info.parsed[\"file_path\"]\n    if not os.path.exists(file_path):\n        raise ValueError(f\"EPUB file does not exist: {file_path}\")\n    if not os.path.isfile(file_path):\n        raise ValueError(f\"Path is not a file: {file_path}\")\n```\n\nAdd EPUB example to the ValueError message (line 94):\n```python\n\"  EPUB:  skill-seekers create ebook.epub\\n\"\n```\n\n#### [x] 2. Argument definitions\n**File**: `src/skill_seekers/cli/arguments/epub.py` (new)\n**Changes**: EPUB-specific argument definitions\n\n```python\n\"\"\"EPUB-specific CLI arguments.\"\"\"\n\nimport argparse\nfrom typing import Any\n\nfrom .common import add_all_standard_arguments\n\nEPUB_ARGUMENTS: dict[str, dict[str, Any]] = {\n    \"epub\": {\n        \"flags\": (\"--epub\",),\n        \"kwargs\": {\n            \"type\": str,\n            \"help\": \"Direct EPUB file path\",\n            \"metavar\": \"PATH\",\n        },\n    },\n    \"from_json\": {\n        \"flags\": (\"--from-json\",),\n        \"kwargs\": {\n            \"type\": str,\n            \"help\": \"Build skill from extracted JSON\",\n            \"metavar\": \"FILE\",\n        },\n    },\n}\n\n\ndef add_epub_arguments(parser: argparse.ArgumentParser) -> None:\n    \"\"\"Add EPUB-specific arguments to parser.\"\"\"\n    add_all_standard_arguments(parser)\n\n    # Override enhance-level default to 0 for EPUB\n    for action in parser._actions:\n        if hasattr(action, \"dest\") and action.dest == \"enhance_level\":\n            action.default = 0\n            action.help = (\n                \"AI enhancement level (auto-detects API vs LOCAL mode): \"\n                \"0=disabled (default for EPUB), 1=SKILL.md only, \"\n                \"2=+architecture/config, 3=full enhancement. \"\n                \"Mode selection: uses API if ANTHROPIC_API_KEY is set, \"\n                \"otherwise LOCAL (Claude Code)\"\n            )\n\n    for arg_name, arg_def in EPUB_ARGUMENTS.items():\n        parser.add_argument(*arg_def[\"flags\"], **arg_def[\"kwargs\"])\n```\n\n#### [x] 3. Create command argument integration\n**File**: `src/skill_seekers/cli/arguments/create.py`\n**Changes**: Add EPUB_ARGUMENTS dict, register in helper functions, add mode handling\n\nAdd after WORD_ARGUMENTS (~line 411):\n```python\n# EPUB specific (from epub.py)\nEPUB_ARGUMENTS: dict[str, dict[str, Any]] = {\n    \"epub\": {\n        \"flags\": (\"--epub\",),\n        \"kwargs\": {\n            \"type\": str,\n            \"help\": \"EPUB file path\",\n            \"metavar\": \"PATH\",\n        },\n    },\n}\n```\n\nAdd to `get_source_specific_arguments()` (line 595):\n```python\n\"epub\": EPUB_ARGUMENTS,\n```\n\nAdd to `add_create_arguments()` (after word block at line 678):\n```python\nif mode in [\"epub\", \"all\"]:\n    for arg_name, arg_def in EPUB_ARGUMENTS.items():\n        parser.add_argument(*arg_def[\"flags\"], **arg_def[\"kwargs\"])\n```\n\n#### [x] 4. Parser class\n**File**: `src/skill_seekers/cli/parsers/epub_parser.py` (new)\n**Changes**: Subcommand parser for standalone `skill-seekers epub` command\n\n```python\n\"\"\"Parser for epub subcommand.\"\"\"\n\nfrom .base import SubcommandParser\nfrom skill_seekers.cli.arguments.epub import add_epub_arguments\n\n\nclass EpubParser(SubcommandParser):\n    \"\"\"Parser for EPUB extraction command.\"\"\"\n\n    @property\n    def name(self) -> str:\n        return \"epub\"\n\n    @property\n    def help(self) -> str:\n        return \"Extract from EPUB e-book (.epub)\"\n\n    @property\n    def description(self) -> str:\n        return \"Extract content from EPUB e-book (.epub) and generate skill\"\n\n    def add_arguments(self, parser):\n        add_epub_arguments(parser)\n```\n\n#### [x] 5. Parser registration\n**File**: `src/skill_seekers/cli/parsers/__init__.py`\n**Changes**: Import and register EpubParser\n\nAdd import (after WordParser import, line 15):\n```python\nfrom .epub_parser import EpubParser\n```\n\nAdd to PARSERS list (after `WordParser()`, line 46):\n```python\nEpubParser(),\n```\n\n#### [x] 6. CLI dispatcher\n**File**: `src/skill_seekers/cli/main.py`\n**Changes**: Add epub to COMMAND_MODULES dict and module docstring\n\nAdd to COMMAND_MODULES (after \"word\" entry, line 52):\n```python\n\"epub\": \"skill_seekers.cli.epub_scraper\",\n```\n\nAdd to module docstring (after \"word\" line, line 15):\n```python\n#    epub                 Extract from EPUB e-book (.epub)\n```\n\n#### [x] 7. Create command routing\n**File**: `src/skill_seekers/cli/create_command.py`\n**Changes**: Add `_route_epub()` method, routing case, help flag, and epilog example\n\nAdd to `_route_to_scraper()` (after word case, line 136):\n```python\nelif self.source_info.type == \"epub\":\n    return self._route_epub()\n```\n\nAdd `_route_epub()` method (after `_route_word()`, line 352):\n```python\ndef _route_epub(self) -> int:\n    \"\"\"Route to EPUB scraper (epub_scraper.py).\"\"\"\n    from skill_seekers.cli import epub_scraper\n\n    argv = [\"epub_scraper\"]\n    file_path = self.source_info.parsed[\"file_path\"]\n    argv.extend([\"--epub\", file_path])\n    self._add_common_args(argv)\n\n    logger.debug(f\"Calling epub_scraper with argv: {argv}\")\n    original_argv = sys.argv\n    try:\n        sys.argv = argv\n        return epub_scraper.main()\n    finally:\n        sys.argv = original_argv\n```\n\nAdd to epilog (line 543, after DOCX example):\n```python\n  EPUB:     skill-seekers create ebook.epub\n```\n\nAdd to Source Auto-Detection section:\n```python\n  • file.epub → EPUB extraction\n```\n\nAdd `--help-epub` flag and handler (after `--help-word` at line 592):\n```python\nparser.add_argument(\n    \"--help-epub\", action=\"store_true\", help=argparse.SUPPRESS, dest=\"_help_epub\"\n)\n```\n\nAdd handler block (after `_help_word` block at line 654):\n```python\nelif args._help_epub:\n    parser_epub = argparse.ArgumentParser(\n        prog=\"skill-seekers create\",\n        description=\"Create skill from EPUB e-book (.epub)\",\n        formatter_class=argparse.RawDescriptionHelpFormatter,\n    )\n    add_create_arguments(parser_epub, mode=\"epub\")\n    parser_epub.print_help()\n    return 0\n```\n\n#### [x] 8. Entry point\n**File**: `pyproject.toml`\n**Changes**: Add standalone entry point\n\nAdd after `skill-seekers-word` (line 224):\n```toml\nskill-seekers-epub = \"skill_seekers.cli.epub_scraper:main\"\n```\n\n#### [x] 9. Positional argument handling in main.py\n**File**: `src/skill_seekers/cli/main.py`\n**Changes**: Add \"input_file\" is already in the positional list at line 153, so no change needed. Verify `_reconstruct_argv` handles epub correctly through the standard delegation path.\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `ruff check src/skill_seekers/cli/source_detector.py src/skill_seekers/cli/arguments/epub.py src/skill_seekers/cli/parsers/epub_parser.py src/skill_seekers/cli/create_command.py` passes\n- [x] `ruff format --check src/skill_seekers/cli/` passes\n- [x] `pip install -e \".[epub]\"` installs with all entry points\n- [x] `skill-seekers create --help` shows EPUB-specific help\n- [x] `skill-seekers create --help-epub` shows EPUB arguments (via standalone entry point `skill-seekers-create`)\n- [x] `skill-seekers create nonexistent.epub` gives clear error about missing file\n- [x] Existing tests still pass: `pytest tests/ -v -x -m \"not slow and not integration\"` (875 passed, 1 pre-existing unrelated failure in test_git_sources_e2e)\n\n#### Manual Verification:\n- [x] `skill-seekers --help` lists `epub` command\n- [x] `skill-seekers create book.epub --dry-run` shows dry run output\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding to the next phase.\n\n---\n\n## Phase 3: Comprehensive Test Suite\n\n### Overview\nCreate `tests/test_epub_scraper.py` with 100+ tests across 11 test classes, covering happy path, negative cases, edge cases, and CLI integration.\n\n### Changes Required:\n\n#### [x] 1. Create test file\n**File**: `tests/test_epub_scraper.py` (new)\n**Changes**: Comprehensive test suite following `test_word_scraper.py` patterns\n\n```python\n\"\"\"\nTests for EPUB scraper (epub_scraper.py).\n\nCovers: initialization, extraction, categorization, skill building,\ncode blocks, tables, images, error handling, JSON workflow, CLI arguments,\nhelper functions, source detection, DRM detection, and edge cases.\n\nTests use mock data and do not require actual EPUB files or ebooklib installed.\n\"\"\"\n\nimport json\nimport os\nimport shutil\nimport tempfile\nimport unittest\nfrom pathlib import Path\nfrom unittest.mock import MagicMock, patch, PropertyMock\n\n\n# Conditional import (same pattern as test_word_scraper.py)\ntry:\n    from skill_seekers.cli.epub_scraper import (\n        EpubToSkillConverter,\n        infer_description_from_epub,\n        _score_code_quality,\n        _check_epub_deps,\n        EPUB_AVAILABLE,\n    )\n    IMPORT_OK = True\nexcept ImportError:\n    IMPORT_OK = False\n```\n\n**Helper factory function:**\n\n```python\ndef _make_sample_extracted_data(\n    num_sections=2,\n    include_code=False,\n    include_tables=False,\n    include_images=False,\n) -> dict:\n    \"\"\"Create minimal extracted_data dict for testing.\"\"\"\n    sections = []\n    total_code = 0\n    total_images = 0\n    languages = {}\n\n    for i in range(1, num_sections + 1):\n        section = {\n            \"section_number\": i,\n            \"heading\": f\"Chapter {i}\",\n            \"heading_level\": \"h1\",\n            \"text\": f\"Content of chapter {i}. This is sample text.\",\n            \"headings\": [{\"level\": \"h2\", \"text\": f\"Section {i}.1\"}],\n            \"code_samples\": [],\n            \"tables\": [],\n            \"images\": [],\n        }\n\n        if include_code:\n            section[\"code_samples\"] = [\n                {\"code\": f\"def func_{i}():\\n    return {i}\", \"language\": \"python\", \"quality_score\": 7.5},\n                {\"code\": f\"console.log({i})\", \"language\": \"javascript\", \"quality_score\": 4.0},\n            ]\n            total_code += 2\n            languages[\"python\"] = languages.get(\"python\", 0) + 1\n            languages[\"javascript\"] = languages.get(\"javascript\", 0) + 1\n\n        if include_tables:\n            section[\"tables\"] = [\n                {\"headers\": [\"Name\", \"Value\"], \"rows\": [[\"key\", \"val\"]]}\n            ]\n\n        if include_images:\n            section[\"images\"] = [\n                {\"index\": 1, \"data\": b\"\\x89PNG\\r\\n\\x1a\\n\", \"width\": 100, \"height\": 100}\n            ]\n            total_images += 1\n\n        sections.append(section)\n\n    return {\n        \"source_file\": \"test.epub\",\n        \"metadata\": {\n            \"title\": \"Test Book\",\n            \"author\": \"Test Author\",\n            \"language\": \"en\",\n            \"publisher\": \"Test Publisher\",\n            \"date\": \"2024-01-01\",\n            \"description\": \"A test book for unit testing\",\n            \"subject\": \"Testing, Unit Tests\",\n            \"rights\": \"Copyright 2024\",\n            \"identifier\": \"urn:uuid:12345\",\n        },\n        \"total_sections\": num_sections,\n        \"total_code_blocks\": total_code,\n        \"total_images\": total_images,\n        \"languages_detected\": languages,\n        \"pages\": sections,\n    }\n```\n\n### Test Classes and Methods:\n\n#### [x] Class 1: `TestEpubToSkillConverterInit` (8 tests)\n\n**Happy path:**\n- `test_init_with_name_and_epub_path` — basic config with name + epub_path\n- `test_init_with_full_config` — config with all fields (name, epub_path, description, categories)\n- `test_default_description_uses_name` — description defaults to \"Use when referencing {name} documentation\"\n- `test_skill_dir_uses_name` — skill_dir is `output/{name}`\n- `test_data_file_uses_name` — data_file is `output/{name}_extracted.json`\n\n**Negative:**\n- `test_init_requires_name` — missing \"name\" key raises KeyError\n- `test_init_empty_name` — empty string name still works (no crash)\n\n**Edge case:**\n- `test_init_with_special_characters_in_name` — name with spaces/dashes sanitized for paths\n\n#### [x] Class 2: `TestEpubExtraction` (12 tests)\n\n**Happy path:**\n- `test_extract_basic_epub` — mock ebooklib, verify sections extracted in spine order\n- `test_extract_metadata` — verify Dublin Core metadata extraction (title, creator, language, etc.)\n- `test_extract_multiple_chapters` — multiple spine items produce multiple sections\n- `test_extract_code_blocks` — `<pre><code>` elements extracted with language detection\n- `test_extract_images` — ITEM_IMAGE items extracted with correct content\n- `test_heading_boundary_splitting` — h1/h2 boundaries create new sections\n\n**Negative:**\n- `test_extract_missing_file_raises_error` — FileNotFoundError for nonexistent path\n- `test_extract_invalid_epub_raises_error` — ValueError for corrupted/non-EPUB file\n- `test_extract_deps_not_installed` — RuntimeError with install instructions when ebooklib missing\n\n**Edge cases:**\n- `test_extract_empty_spine` — EPUB with no spine items produces empty sections list\n- `test_extract_spine_item_no_body` — XHTML without `<body>` tag skipped gracefully\n- `test_extract_non_linear_spine_items` — linear=\"no\" items still extracted (included but flagged)\n\n#### [x] Class 3: `TestEpubDrmDetection` (6 tests)\n\n**Happy path:**\n- `test_no_drm_detected` — normal EPUB without encryption.xml returns False\n\n**Negative:**\n- `test_drm_detected_adobe_adept` — encryption.xml with Adobe namespace raises RuntimeError\n- `test_drm_detected_apple_fairplay` — encryption.xml with Apple namespace raises RuntimeError\n- `test_drm_detected_readium_lcp` — encryption.xml with Readium namespace raises RuntimeError\n\n**Edge cases:**\n- `test_font_obfuscation_not_drm` — encryption.xml with only IDPF font obfuscation algorithm (`http://www.idpf.org/2008/embedding`) is NOT DRM, extraction proceeds\n- `test_drm_error_message_is_clear` — error message mentions DRM and suggests removing protection\n\n#### [x] Class 4: `TestEpubCategorization` (8 tests)\n\n**Happy path:**\n- `test_single_source_creates_one_category` — single EPUB creates category named after file\n- `test_keyword_categorization` — sections matched to categories by keyword scoring\n- `test_no_categories_uses_default` — no category config creates single \"content\" category\n\n**Negative:**\n- `test_categorize_empty_sections` — empty sections list produces empty categories\n- `test_categorize_no_keyword_matches` — unmatched sections go to \"other\" category\n\n**Edge cases:**\n- `test_categorize_single_section` — one section creates one category\n- `test_categorize_many_sections` — 50+ sections categorized correctly\n- `test_categorize_preserves_section_order` — sections maintain original order within categories\n\n#### [x] Class 5: `TestEpubSkillBuilding` (10 tests)\n\n**Happy path:**\n- `test_build_creates_directory_structure` — output/{name}/, references/, scripts/, assets/ created\n- `test_build_generates_skill_md` — SKILL.md created with YAML frontmatter\n- `test_build_generates_reference_files` — reference markdown files created per category\n- `test_build_generates_index` — references/index.md created with category links\n- `test_skill_md_contains_metadata` — SKILL.md includes title, author, language from metadata\n- `test_skill_md_yaml_frontmatter` — frontmatter has name and description fields\n\n**Negative:**\n- `test_build_without_extracted_data_fails` — calling build_skill() before extraction raises error\n\n**Edge cases:**\n- `test_build_overwrites_existing_output` — re-running build overwrites existing files\n- `test_build_with_long_name` — name > 64 chars truncated in YAML frontmatter\n- `test_build_with_unicode_content` — Unicode text (CJK, Arabic, emoji) preserved correctly\n\n#### [x] Class 6: `TestEpubCodeBlocks` (8 tests)\n\n**Happy path:**\n- `test_code_blocks_included_in_reference_files` — code samples appear in reference markdown\n- `test_code_blocks_in_skill_md_top_15` — SKILL.md shows top 15 code examples by quality\n- `test_code_language_grouped` — code examples grouped by language in SKILL.md\n\n**Edge cases:**\n- `test_empty_code_block` — `<pre><code></code></pre>` with no content skipped\n- `test_code_block_with_html_entities` — `&lt;`, `&gt;`, `&amp;` decoded to `<`, `>`, `&`\n- `test_code_block_with_syntax_highlighting_spans` — `<span class=\"keyword\">` stripped, plain text preserved\n- `test_code_block_language_from_class` — `class=\"language-python\"`, `class=\"code-rust\"` detected\n- `test_code_quality_scoring` — scoring heuristic produces expected ranges (0-10)\n\n#### [x] Class 7: `TestEpubTables` (5 tests)\n\n**Happy path:**\n- `test_tables_in_reference_files` — tables rendered as markdown in reference files\n- `test_table_with_headers` — headers from `<thead>` used correctly\n\n**Edge cases:**\n- `test_table_no_thead` — first row used as headers when no `<thead>`\n- `test_empty_table` — empty `<table>` element handled gracefully\n- `test_table_with_colspan_rowspan` — complex tables don't crash (data may be imperfect)\n\n#### [x] Class 8: `TestEpubImages` (7 tests)\n\n**Happy path:**\n- `test_images_saved_to_assets` — image bytes written to assets/ directory\n- `test_image_references_in_markdown` — markdown `![Image](../assets/...)` references correct\n\n**Negative:**\n- `test_image_with_zero_bytes` — empty image content skipped\n\n**Edge cases:**\n- `test_svg_images_handled` — SVG items (ITEM_VECTOR) extracted or skipped gracefully\n- `test_image_filename_conflicts` — duplicate filenames disambiguated\n- `test_cover_image_identified` — cover image (ITEM_COVER) extracted\n- `test_many_images` — 100+ images extracted without error\n\n#### [x] Class 9: `TestEpubErrorHandling` (10 tests)\n\n**Negative / error cases:**\n- `test_missing_epub_file_raises_error` — FileNotFoundError for nonexistent path\n- `test_not_a_file_raises_error` — ValueError when path is a directory\n- `test_not_epub_extension_raises_error` — ValueError for .txt, .pdf, .doc files\n- `test_corrupted_zip_raises_error` — ValueError or RuntimeError for corrupted ZIP\n- `test_missing_container_xml` — ValueError for ZIP without META-INF/container.xml\n- `test_missing_opf_file` — ValueError when container.xml points to nonexistent OPF\n- `test_drm_protected_raises_error` — RuntimeError with clear DRM message\n- `test_empty_epub_raises_error` — ValueError for EPUB with no content documents\n- `test_ebooklib_not_installed_error` — RuntimeError with install instructions\n- `test_malformed_xhtml_handled_gracefully` — unclosed tags, invalid entities don't crash (BeautifulSoup tolerant parsing)\n\n#### [x] Class 10: `TestEpubJSONWorkflow` (6 tests)\n\n**Happy path:**\n- `test_load_extracted_json` — load previously extracted JSON\n- `test_build_from_json` — full workflow: load JSON → categorize → build\n- `test_json_round_trip` — extract → save JSON → load JSON → build produces same output\n\n**Negative:**\n- `test_load_invalid_json` — malformed JSON raises appropriate error\n- `test_load_nonexistent_json` — FileNotFoundError for missing file\n\n**Edge case:**\n- `test_json_with_missing_fields` — partial JSON (missing optional fields) still works\n\n#### [x] Class 11: `TestEpubCLIArguments` (8 tests)\n\n**Happy path:**\n- `test_epub_flag_accepted` — `--epub path.epub` parsed correctly\n- `test_from_json_flag_accepted` — `--from-json data.json` parsed correctly\n- `test_name_flag_accepted` — `--name mybook` parsed correctly\n- `test_enhance_level_default_zero` — enhance-level defaults to 0 for EPUB\n- `test_dry_run_flag` — `--dry-run` flag parsed correctly\n\n**Negative:**\n- `test_no_args_shows_error` — no `--epub` or `--from-json` shows error\n\n**Integration:**\n- `test_verbose_flag` — `--verbose` accepted\n- `test_quiet_flag` — `--quiet` accepted\n\n#### [x] Class 12: `TestEpubHelperFunctions` (6 tests)\n\n- `test_infer_description_from_metadata_description` — uses description field\n- `test_infer_description_from_metadata_title` — falls back to title\n- `test_infer_description_fallback` — falls back to name-based template\n- `test_infer_description_empty_metadata` — empty dict returns fallback\n- `test_score_code_quality_ranges` — scoring returns 0-10\n- `test_sanitize_filename` — special characters cleaned\n\n#### [x] Class 13: `TestEpubSourceDetection` (6 tests)\n\n- `test_epub_detected_as_epub_type` — `.epub` extension detected correctly\n- `test_epub_suggested_name` — filename stem used as suggested name\n- `test_epub_validation_missing_file` — validation raises ValueError for missing file\n- `test_epub_validation_not_a_file` — validation raises ValueError for directory\n- `test_epub_with_path` — `./books/test.epub` detected with correct file_path\n- `test_pdf_still_detected` — regression test: `.pdf` still detected as pdf type\n\n#### [x] Class 14: `TestEpubEdgeCases` (8 tests)\n\n**Per W3C EPUB 3.3 spec edge cases:**\n- `test_epub2_vs_epub3` — both versions parse successfully (ebooklib handles both)\n- `test_epub_no_toc` — EPUB without table of contents extracts using spine order\n- `test_epub_empty_chapters` — chapters with no text content skipped gracefully\n- `test_epub_single_chapter` — book with one spine item produces valid output\n- `test_epub_unicode_content` — CJK, Arabic, Cyrillic, emoji text preserved\n- `test_epub_large_section_count` — 100+ sections processed without error\n- `test_epub_nested_headings` — h3/h4/h5/h6 become sub-headings within sections\n- `test_fixed_layout_detected` — fixed-layout EPUB produces warning but still extracts text\n\n**Total: ~108 test methods across 14 classes**\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `pytest tests/test_epub_scraper.py -v` — all 107 tests pass\n- [x] `pytest tests/ -v -x -m \"not slow and not integration\"` — 982 passed (1 pre-existing unrelated failure in test_git_sources_e2e)\n- [x] `ruff check tests/test_epub_scraper.py` passes\n- [x] `ruff format --check tests/test_epub_scraper.py` passes\n- [x] Test count >= 100 methods (107 tests across 14 classes)\n\n#### Manual Verification:\n- [x] Review test coverage includes: happy path, negative, edge cases, CLI, source detection, DRM, JSON workflow\n- [x] Verify no tests require actual EPUB files or ebooklib installed (all use mocks/skipTest guards)\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding to the next phase.\n\n---\n\n## Phase 4: Documentation\n\n### Overview\nUpdate CLAUDE.md and CHANGELOG.md to reflect the new EPUB support.\n\n### Changes Required:\n\n#### [x] 1. Update CLAUDE.md\n**File**: `CLAUDE.md`\n**Changes**:\n\nAdd to Commands section (after pdf line):\n```\nskill-seekers create book.epub --name myskill\n```\n\nAdd to \"Unified create\" examples:\n```\nskill-seekers create book.epub\n```\n\nAdd to Key source files table:\n```\n| Core scraping | `cli/epub_scraper.py` |\n```\n\nAdd to \"Adding things → New create command flags\" section:\n```\n- Source-specific → `EPUB_ARGUMENTS`\n```\n\n#### [x] 2. Update CHANGELOG.md\n**File**: `CHANGELOG.md`\n**Changes**: Add entry for EPUB support under next version\n\n```markdown\n### Added\n- EPUB (.epub) input support via `skill-seekers create book.epub` or `skill-seekers epub --epub book.epub`\n- Extracts chapters, metadata, code blocks, images, and tables from EPUB 2 and EPUB 3 files\n- DRM detection with clear error messages\n- Optional dependency: `pip install \"skill-seekers[epub]\"`\n```\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `ruff check` passes on any modified files\n- [x] `pytest tests/ -v -x -m \"not slow and not integration\"` — all tests still pass (982 passed, 1 pre-existing failure)\n\n#### Manual Verification:\n- [x] CLAUDE.md accurately reflects new commands\n- [x] CHANGELOG.md entry is clear and complete\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding.\n\n---\n\n## Testing Strategy\n\n### Unit Tests (Phase 3 — ~108 tests):\n\n**By category:**\n| Category | Count | What's tested |\n|----------|-------|---------------|\n| Initialization | 8 | Config parsing, defaults, edge cases |\n| Extraction | 12 | Spine iteration, metadata, headings, code, images |\n| DRM detection | 6 | Adobe, Apple, Readium, font obfuscation (not DRM) |\n| Categorization | 8 | Single/multi category, keywords, empty, ordering |\n| Skill building | 10 | Directory structure, SKILL.md, references, index |\n| Code blocks | 8 | Extraction, quality, language detection, HTML entities |\n| Tables | 5 | Headers, no-thead fallback, empty, colspan |\n| Images | 7 | Save, references, SVG, conflicts, cover, many |\n| Error handling | 10 | Missing file, corrupt, DRM, no deps, malformed XHTML |\n| JSON workflow | 6 | Load, build, round-trip, invalid, missing fields |\n| CLI arguments | 8 | Flags, defaults, dry-run, verbose/quiet |\n| Helper functions | 6 | Description inference, quality scoring, filename sanitization |\n| Source detection | 6 | Detection, validation, regression |\n| Edge cases | 8 | EPUB 2/3, no TOC, empty chapters, Unicode, fixed-layout |\n\n### Integration Tests:\n- Full extract → categorize → build workflow with mock ebooklib\n- JSON round-trip (extract → save → load → build)\n\n### Manual Testing Steps:\n1. `pip install -e \".[epub]\"` — verify install\n2. `skill-seekers create book.epub` with a real EPUB file — verify output directory structure\n3. `skill-seekers create book.epub --dry-run` — verify dry run output\n4. `skill-seekers create drm-book.epub` — verify DRM error message\n5. `skill-seekers create nonexistent.epub` — verify file-not-found error\n6. Open generated `SKILL.md` — verify content quality and structure\n\n## Performance Considerations\n\n- ebooklib loads entire EPUB into memory. For typical books (<50MB), this is fine\n- For very large EPUBs (100MB+), memory usage may spike. No mitigation needed for v1 — document as known limitation\n- BeautifulSoup parsing of XHTML is fast. No performance concerns expected\n\n## Migration Notes\n\n- No migration needed — this is a new feature with no existing data to migrate\n- Optional dependency (`ebooklib`) means existing installs are unaffected\n- No breaking changes to any existing commands or APIs\n\n## References\n\n- [W3C EPUB 3.3 Specification](https://www.w3.org/TR/epub-33/) — authoritative source of truth\n- [W3C EPUB Reading Systems 3.3](https://www.w3.org/TR/epub-rs-33/) — reading system requirements\n- [ebooklib GitHub](https://github.com/aerkalov/ebooklib) — Python EPUB library\n- [ebooklib PyPI](https://pypi.org/project/EbookLib/) — v0.20, Python 3.9-3.13\n- [Research document](../research/2026-03-14-epub-input-support-affected-files.md) — affected files analysis\n- Similar implementation: `src/skill_seekers/cli/word_scraper.py` — closest analog\n- Similar tests: `tests/test_word_scraper.py` — test pattern template\n","docs/agents/research/2026-03-14-epub-input-support-affected-files.md":"---\ndate: 2026-03-14T12:54:24.700367+00:00\ngit_commit: 7c90a4b9c9bccac8341b0769550d77aae3b4e524\nbranch: development\ntopic: \"What files would be affected to add .epub support for input\"\ntags: [research, codebase, epub, input-format, scraper]\nstatus: complete\n---\n\n> 🗄️ **Historical — completed** — This research informed the EPUB implementation that is now live in Skill Seekers v3.6.0.\n\n# Research: What files would be affected to add .epub support for input\n\n## Research Question\n\nWhat files would be affected to add .epub support for input.\n\n## Summary\n\nAdding `.epub` input support follows an established pattern already used for PDF and Word (.docx) formats. The codebase has a consistent multi-layer architecture for document input formats: source detection, argument definitions, parser registration, create command routing, standalone scraper module, and tests. Based on analysis of the existing PDF and Word implementations, **16 existing files would need modification** and **4 new files would need to be created**.\n\n## Detailed Findings\n\n### New Files to Create (4 files)\n\n| File | Purpose |\n|------|---------|\n| `src/skill_seekers/cli/epub_scraper.py` | Core EPUB extraction and skill building logic (analog: `word_scraper.py` at ~750 lines) |\n| `src/skill_seekers/cli/arguments/epub.py` | EPUB-specific argument definitions (analog: `arguments/word.py`) |\n| `src/skill_seekers/cli/parsers/epub_parser.py` | Subcommand parser class (analog: `parsers/word_parser.py`) |\n| `tests/test_epub_scraper.py` | Test suite (analog: `test_word_scraper.py` at ~750 lines, 130+ tests) |\n\n### Existing Files to Modify (16 files)\n\n#### 1. Source Detection Layer\n\n**`src/skill_seekers/cli/source_detector.py`** (3 locations)\n\n- **`SourceDetector.detect()`** (line ~60): Add `.epub` extension check, following the `.docx` pattern at line 63-64:\n  ```python\n  if source.endswith(\".epub\"):\n      return cls._detect_epub(source)\n  ```\n\n- **New method `_detect_epub()`**: Add detection method (following `_detect_word()` at lines 124-129):\n  ```python\n  @classmethod\n  def _detect_epub(cls, source: str) -> SourceInfo:\n      name = os.path.splitext(os.path.basename(source))[0]\n      return SourceInfo(\n          type=\"epub\", parsed={\"file_path\": source}, suggested_name=name, raw_input=source\n      )\n  ```\n\n- **`validate_source()`** (line ~250): Add epub validation block (following the word block at lines 273-278)\n\n- **Error message** (line ~94): Add EPUB example to the `ValueError` help text\n\n#### 2. CLI Dispatcher\n\n**`src/skill_seekers/cli/main.py`** (2 locations)\n\n- **`COMMAND_MODULES` dict** (line ~46): Add epub entry:\n  ```python\n  \"epub\": \"skill_seekers.cli.epub_scraper\",\n  ```\n\n- **Module docstring** (line ~1): Add `epub` to the commands list\n\n#### 3. Create Command Routing\n\n**`src/skill_seekers/cli/create_command.py`** (3 locations)\n\n- **`_route_to_scraper()`** (line ~121): Add `elif self.source_info.type == \"epub\":` routing case\n\n- **New `_route_epub()` method**: Following the `_route_word()` pattern at lines 331-352:\n  ```python\n  def _route_epub(self) -> int:\n      from skill_seekers.cli import epub_scraper\n      argv = [\"epub_scraper\"]\n      file_path = self.source_info.parsed[\"file_path\"]\n      argv.extend([\"--epub\", file_path])\n      self._add_common_args(argv)\n      # epub-specific args here\n      ...\n  ```\n\n- **`main()` epilog** (line ~537): Add EPUB example and source auto-detection entry\n\n- **Progressive help** (line ~590): Add `--help-epub` flag and handler block\n\n#### 4. Argument Definitions\n\n**`src/skill_seekers/cli/arguments/create.py`** (4 locations)\n\n- **New `EPUB_ARGUMENTS` dict** (~line 401): Define epub-specific arguments (e.g., `--epub` file path flag), following the `WORD_ARGUMENTS` pattern at lines 402-411\n\n- **`get_source_specific_arguments()`** (line 595): Add `\"epub\": EPUB_ARGUMENTS` to the `source_args` dict\n\n- **`add_create_arguments()`** (line 676): Add epub mode block:\n  ```python\n  if mode in [\"epub\", \"all\"]:\n      for arg_name, arg_def in EPUB_ARGUMENTS.items():\n          parser.add_argument(*arg_def[\"flags\"], **arg_def[\"kwargs\"])\n  ```\n\n#### 5. Parser Registration\n\n**`src/skill_seekers/cli/parsers/__init__.py`** (2 locations)\n\n- **Import** (line ~15): Add `from .epub_parser import EpubParser`\n\n- **`PARSERS` list** (line ~46): Add `EpubParser()` entry (near `WordParser()` and `PDFParser()`)\n\n#### 6. Package Configuration\n\n**`pyproject.toml`** (3 locations)\n\n- **`[project.optional-dependencies]`** (line ~111): Add `epub` optional dependency group:\n  ```toml\n  epub = [\n      \"ebooklib>=0.18\",\n  ]\n  ```\n\n- **`all` optional dependency group** (line ~178): Add epub dependency to the combined `all` group\n\n- **`[project.scripts]`** (line ~224): Add standalone entry point:\n  ```toml\n  skill-seekers-epub = \"skill_seekers.cli.epub_scraper:main\"\n  ```\n\n#### 7. Argument Commons\n\n**`src/skill_seekers/cli/arguments/common.py`**\n\n- No changes strictly required, but `add_all_standard_arguments()` is called by the new `arguments/epub.py` (no modification needed — it's used as-is)\n\n#### 8. Documentation / Configuration\n\n**`CLAUDE.md`** (2 locations)\n\n- **Commands section**: Add `epub` to the list of subcommands\n- **Key source files table**: Add `epub_scraper.py` entry\n\n**`CONTRIBUTING.md`** — Potentially update with epub format mention\n\n**`CHANGELOG.md`** — New feature entry\n\n### Files NOT Affected\n\nThese files do **not** need changes:\n\n- **`unified_scraper.py`** — Multi-source configs could add epub support later but it's not required for basic input support\n- **Platform adaptors** (`adaptors/*.py`) — Adaptors work on the output side (packaging), not input\n- **Enhancement system** (`enhance_skill.py`, `enhance_skill_local.py`) — Works generically on SKILL.md\n- **MCP server** (`mcp/server_fastmcp.py`) — Operates on completed skills\n- **`pdf_extractor_poc.py`** — PDF-specific extraction; epub needs its own extractor\n\n## Code References\n\n### Pattern to Follow (Word .docx implementation)\n\n- `src/skill_seekers/cli/word_scraper.py:1-750` — Full scraper with `WordToSkillConverter` class\n- `src/skill_seekers/cli/arguments/word.py:1-75` — Argument definitions with `add_word_arguments()`\n- `src/skill_seekers/cli/parsers/word_parser.py:1-33` — Parser class extending `SubcommandParser`\n- `tests/test_word_scraper.py:1-750` — Comprehensive test suite with 130+ tests\n\n### Key Integration Points\n\n- `src/skill_seekers/cli/source_detector.py:57-65` — File extension detection order\n- `src/skill_seekers/cli/source_detector.py:124-129` — `_detect_word()` method (template for `_detect_epub()`)\n- `src/skill_seekers/cli/create_command.py:121-143` — `_route_to_scraper()` dispatch\n- `src/skill_seekers/cli/create_command.py:331-352` — `_route_word()` (template for `_route_epub()`)\n- `src/skill_seekers/cli/arguments/create.py:401-411` — `WORD_ARGUMENTS` dict (template)\n- `src/skill_seekers/cli/arguments/create.py:595-604` — `get_source_specific_arguments()` mapping\n- `src/skill_seekers/cli/arguments/create.py:676-678` — `add_create_arguments()` mode handling\n- `src/skill_seekers/cli/parsers/__init__.py:35-59` — `PARSERS` registry list\n- `src/skill_seekers/cli/main.py:46-70` — `COMMAND_MODULES` dict\n- `pyproject.toml:111-115` — Optional dependency group pattern (docx)\n- `pyproject.toml:213-246` — Script entry points\n\n### Data Flow Architecture\n\nThe epub scraper would follow the same three-step pipeline as Word/PDF:\n\n1. **Extract** — Parse `.epub` file → sections with text, headings, code, images → save to `output/{name}_extracted.json`\n2. **Categorize** — Group sections by chapters/keywords\n3. **Build** — Generate `SKILL.md`, `references/*.md`, `references/index.md`, `assets/`\n\nThe intermediate JSON format uses the same structure as Word/PDF:\n```python\n{\n    \"source_file\": str,\n    \"metadata\": {\"title\", \"author\", \"created\", ...},\n    \"total_sections\": int,\n    \"total_code_blocks\": int,\n    \"total_images\": int,\n    \"languages_detected\": {str: int},\n    \"pages\": [  # sections\n        {\n            \"section_number\": int,\n            \"heading\": str,\n            \"text\": str,\n            \"code_samples\": [...],\n            \"images\": [...],\n            \"headings\": [...]\n        }\n    ]\n}\n```\n\n## Architecture Documentation\n\n### Document Input Format Pattern\n\nEach input format follows a consistent architecture:\n\n```\n[source_detector.py] → detect type by extension\n        ↓\n[create_command.py] → route to scraper\n        ↓\n[{format}_scraper.py] → extract → categorize → build skill\n        ↓\n[output/{name}/] → SKILL.md + references/ + assets/\n```\n\nSupporting files per format:\n- `arguments/{format}.py` — CLI argument definitions\n- `parsers/{format}_parser.py` — Subcommand parser class\n- `tests/test_{format}_scraper.py` — Test suite\n\n### Dependency Guard Pattern\n\nThe Word scraper uses an optional dependency guard that epub should replicate:\n\n```python\ntry:\n    import ebooklib\n    from ebooklib import epub\n    EPUB_AVAILABLE = True\nexcept ImportError:\n    EPUB_AVAILABLE = False\n\ndef _check_epub_deps():\n    if not EPUB_AVAILABLE:\n        raise RuntimeError(\n            \"ebooklib is required for EPUB support.\\n\"\n            'Install with: pip install \"skill-seekers[epub]\"\\n'\n            \"Or: pip install ebooklib\"\n        )\n```\n\n## Summary Table\n\n| Category | Files | Action |\n|----------|-------|--------|\n| New files | 4 | Create from scratch |\n| Source detection | 1 | Add epub detection + validation |\n| CLI dispatcher | 1 | Add command module mapping |\n| Create command | 1 | Add routing + help + examples |\n| Arguments | 1 | Add EPUB_ARGUMENTS + register in helpers |\n| Parser registry | 1 | Import + register EpubParser |\n| Package config | 1 | Add deps + entry point |\n| Documentation | 2+ | Update CLAUDE.md, CHANGELOG |\n| **Total** | **12+ modified, 4 new** | |\n\n## Open Questions\n\n- Should epub support reuse any of the existing HTML parsing from `word_scraper.py` (which uses mammoth to convert to HTML then parses with BeautifulSoup)? EPUB internally contains XHTML files, so BeautifulSoup parsing would be directly applicable.\n- Should the epub scraper support DRM-protected files, or only DRM-free epub files?\n- Should epub-specific arguments include options like `--chapter-range` (similar to PDF's `--pages`)?\n","skills/skill-seekers/SKILL.md":"---\nname: skill-builder\ndescription: Automatically detect source types and build AI skills using Skill Seekers. Use when the user wants to create skills from documentation, repos, PDFs, videos, or other knowledge sources.\n---\n\n# Skill Builder\n\nYou have access to the Skill Seekers MCP server which provides 40 tools for converting knowledge sources into AI-ready skills.\n\n## When to Use This Skill\n\nUse this skill when the user:\n- Wants to create an AI skill from a documentation site, GitHub repo, PDF, video, or other source\n- Needs to convert documentation into a format suitable for LLM consumption\n- Wants to update or sync existing skills with their source documentation\n- Needs to export skills to vector databases (Weaviate, Chroma, FAISS, Qdrant)\n- Asks about scraping, converting, or packaging documentation for AI\n\n## Source Type Detection\n\nAutomatically detect the source type from user input:\n\n| Input Pattern | Source Type | Tool to Use |\n|---------------|-------------|-------------|\n| `https://...` (not GitHub/YouTube) | Documentation | `scrape_docs` |\n| `owner/repo` or `github.com/...` | GitHub | `scrape_github` |\n| `*.pdf` | PDF | `scrape_pdf` |\n| YouTube/Vimeo URL or video file | Video | `scrape_video` |\n| Local directory path | Codebase | `scrape_codebase` |\n| `*.ipynb`, `*.html`, `*.yaml` (OpenAPI), `*.adoc`, `*.pptx`, `*.rss`, `*.1`-`.8` | Various | `scrape_generic` |\n| JSON config file | Unified | Use config with `scrape_docs` |\n\n## Recommended Workflow\n\n1. **Detect source type** from the user's input\n2. **Generate or fetch config** using `generate_config` or `fetch_config` if needed\n3. **Estimate scope** with `estimate_pages` for documentation sites\n4. **Scrape the source** using the appropriate scraping tool\n5. **Enhance** with `enhance_skill` if the user wants AI-powered improvements\n6. **Package** with `package_skill` for the target platform\n7. **Export to vector DB** if requested using `export_to_*` tools\n\n## Available MCP Tools\n\n### Config Management\n- `generate_config` — Generate a scraping config from a URL\n- `list_configs` — List available preset configs\n- `validate_config` — Validate a config file\n\n### Scraping (use based on source type)\n- `scrape_docs` — Documentation sites\n- `scrape_github` — GitHub repositories\n- `scrape_pdf` — PDF files\n- `scrape_video` — Video transcripts\n- `scrape_codebase` — Local code analysis\n- `scrape_generic` — Jupyter, HTML, OpenAPI, AsciiDoc, PPTX, RSS, manpage, Confluence, Notion, chat\n\n### Post-processing\n- `enhance_skill` — AI-powered skill enhancement\n- `package_skill` — Package for target platform\n- `upload_skill` — Upload to platform API\n- `install_skill` — End-to-end install workflow\n\n### Advanced\n- `detect_patterns` — Design pattern detection in code\n- `extract_test_examples` — Extract usage examples from tests\n- `build_how_to_guides` — Generate how-to guides from tests\n- `split_config` — Split large configs into focused skills\n- `export_to_weaviate`, `export_to_chroma`, `export_to_faiss`, `export_to_qdrant` — Vector DB export\n","tests/golden/phase2/chat/SKILL.md":"---\nname: golden-chat\ndescription: Use when testing the golden_chat golden build\n---\n\n# Golden_Chat Slack Chat Skill\n\nUse when testing the golden_chat golden build\n\n## 📋 Slack Chat Information\n\n**Platform:** Slack\n\n**Source:** fixtures/slack-export/\n\n**Total Messages:** 6\n\n**Unique Users:** 3\n\n**Channels:** #engineering, #random\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **#engineering**: 2 sections\n- **#random**: 1 sections\n\n## 🔑 Key Discussion Topics\n\n*Topics frequently discussed in chat*\n\n- **Troubleshooting**: 1 conversations\n- **Setup**: 1 conversations\n\n## 📝 Top Code Snippets\n\n*High-quality code shared in chat*\n\n### Python (2 snippets)\n\n**Snippet 1** (by bob) (Quality: 9.5/10):\n\n```python\ndef long_helper():\n    y0 = 0\n    y1 = 1\n    y2 = 2\n    y3 = 3\n    y4 = 4\n    y5 = 5\n    y6 = 6\n    y7 = 7\n    y8 = 8\n    y9 = 9\n    y10 = 10\n    y11 = 11\n    y12 = 12\n    y13 = 13\n    y14 = 14\n    y15 = 15\n    y16 = 16\n    y17 = 17\n    y18 = 18\n    y19 = 19\n    y20 = 20\n    y21 = 21\n    y22 = 22\n    y23 = 23\n    y24 = 24\n    y25 = 25\n    y26 = 26\n    y27 = 27\n    y28 = 28\n    y29 = 29\n    y30 = 30\n    y31 = 31\n    y32 = 32\n    y33 = 33\n    y34 = 34\n    y35 = 35\n    y36 = 36\n    y37 = 37\n    y38\n...\n```\n\n**Snippet 2** (by bob) (Quality: 7.0/10):\n\n```python\nprint('patched')\n```\n\n### Unknown (1 snippets)\n\n**Snippet 1** (by alice) (Quality: 4.0/10):\n\n```unknown\nkubectl get pods\n```\n\n## 🔗 Shared Links (21)\n\n*Key resources shared in chat*\n\n- https://example.com/resource/0 (by alice, in #engineering)\n- https://example.com/resource/1 (by carol, in #random)\n- https://example.com/resource/2 (by alice, in #engineering)\n- https://example.com/resource/3 (by carol, in #random)\n- https://example.com/resource/4 (by alice, in #engineering)\n- https://example.com/resource/5 (by carol, in #random)\n- https://example.com/resource/6 (by alice, in #engineering)\n- https://example.com/resource/7 (by carol, in #random)\n- https://example.com/resource/8 (by alice, in #engineering)\n- https://example.com/resource/9 (by carol, in #random)\n- https://example.com/resource/10 (by alice, in #engineering)\n- https://example.com/resource/11 (by carol, in #random)\n- https://example.com/resource/12 (by alice, in #engineering)\n- https://example.com/resource/13 (by carol, in #random)\n- https://example.com/resource/14 (by alice, in #engineering)\n- https://example.com/resource/15 (by carol, in #random)\n- https://example.com/resource/16 (by alice, in #engineering)\n- https://example.com/resource/17 (by carol, in #random)\n- https://example.com/resource/18 (by alice, in #engineering)\n- https://example.com/resource/19 (by carol, in #random)\n\n*... and 1 more links*\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 6\n- **Total Threads**: 1\n- **Code Snippets**: 3\n- **Shared Links**: 21\n- **Unique Users**: 3\n- **Channels**: 2\n\n**Channel Activity:**\n\n- #engineering: 5 messages, 2 users\n- #random: 1 messages, 1 users\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/engineering_s1-s2.md` - #engineering\n- `references/random_s3-s3.md` - #random\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Slack Chat Scraper\n","tests/golden/phase2/chat_empty/SKILL.md":"---\nname: golden-chat-empty\ndescription: Use when testing the golden_chat_empty golden build\n---\n\n# Golden_Chat_Empty Slack Chat Skill\n\nUse when testing the golden_chat_empty golden build\n\n## 📋 Slack Chat Information\n\n**Platform:** Slack\n\n**Source:** fixtures/empty-export/\n\n**Total Messages:** 0\n\n**Unique Users:** 0\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat_empty chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 0\n\n**Content Breakdown:**\n\n- **Chat Content**: 0 sections\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 0\n- **Total Threads**: 0\n- **Code Snippets**: 0\n- **Shared Links**: 0\n- **Unique Users**: 0\n- **Channels**: 0\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_01.md` - Chat Content\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Slack Chat Scraper\n","tests/golden/phase2/chat_single/SKILL.md":"---\nname: golden-chat-single\ndescription: Use when testing the golden_chat_single golden build\n---\n\n# Golden_Chat_Single Slack Chat Skill\n\nUse when testing the golden_chat_single golden build\n\n## 📋 Slack Chat Information\n\n**Platform:** Slack\n\n**Source:** fixtures/slack-export/\n\n**Total Messages:** 1\n\n**Unique Users:** 1\n\n**Channels:** #general\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat_single chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 1\n\n**Content Breakdown:**\n\n- **General Discussion**: 1 sections\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 1\n- **Total Threads**: 0\n- **Code Snippets**: 0\n- **Shared Links**: 0\n- **Unique Users**: 1\n- **Channels**: 1\n\n**Channel Activity:**\n\n- #general: 1 messages, 1 users\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/main.md` - General Discussion\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Slack Chat Scraper\n","tests/golden/phase2/chat_topics/SKILL.md":"---\nname: golden-chat-topics\ndescription: Use when testing the golden_chat_topics golden build\n---\n\n# Golden_Chat_Topics Discord Chat Skill\n\nUse when testing the golden_chat_topics golden build\n\n## 📋 Discord Chat Information\n\n**Platform:** Discord\n\n**Source:** fixtures/discord-export.json\n\n**Total Messages:** 3\n\n**Unique Users:** 2\n\n**Channels:** #help\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat_topics chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Troubleshooting**: 1 sections\n- **General Discussion**: 1 sections\n\n## 🔑 Key Discussion Topics\n\n*Topics frequently discussed in chat*\n\n- **Troubleshooting**: 1 conversations\n- **Setup**: 1 conversations\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 3\n- **Total Threads**: 0\n- **Code Snippets**: 0\n- **Shared Links**: 0\n- **Unique Users**: 2\n- **Channels**: 1\n\n**Channel Activity:**\n\n- #help: 3 messages, 2 users\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/setup_s2-s2.md` - Setup\n- `references/troubleshooting_s1-s1.md` - Troubleshooting\n- `references/general_s3-s3.md` - General Discussion\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Discord Chat Scraper\n","tests/golden/phase2/epub/SKILL.md":"---\nname: golden-epub\ndescription: Use when testing the epub golden build\n---\n\n# Golden_Epub Documentation Skill\n\nUse when testing the epub golden build\n\n## 📋 Document Information\n\n**Title:** The Handbook\n\n**Author:** Jane Doe\n\n**Language:** en\n\n**Publisher:** Acme Press\n\n**Date:** 2024-01-01\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_epub concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **handbook**: 3 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 1\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/handbook.md` - handbook\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | EPUB Scraper\n","tests/golden/phase2/epub_kw/SKILL.md":"---\nname: golden-epub-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Epub_Kw Documentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_epub_kw concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Api**: 1 sections\n- **Other**: 1 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 1\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s2-s2.md` - Api\n- `references/section_s3-s3.md` - Other\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | EPUB Scraper\n","tests/golden/phase2/html/SKILL.md":"---\nname: golden-html\ndescription: Use when testing the html golden build\n---\n\n# Golden_Html Documentation Skill\n\nUse when testing the html golden build\n\n## 📋 Document Information\n\n**Title:** The Web Handbook\n\n**Author:** Jane Doe\n\n**Language:** en\n\n**Description:** A handbook about the web.\n\n**Keywords:** web, html, docs\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_html concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 4\n\n**Content Breakdown:**\n\n- **page**: 4 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n- Changelog\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Changelog** (1 sections):\n- Changelog (section 4)\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 4\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **HTML Files**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/page.md` - page\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | HTML Scraper\n","tests/golden/phase2/html_kw/SKILL.md":"---\nname: golden-html-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Html_Kw Documentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_html_kw concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 4\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Api**: 1 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n- Changelog\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Changelog** (1 sections):\n- Changelog (section 4)\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 4\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **HTML Files**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s2-s2.md` - Api\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | HTML Scraper\n","tests/golden/phase2/html_multi/SKILL.md":"---\nname: golden-html-multi\ndescription: Use when testing the multi-file html build\n---\n\n# Golden_Html_Multi Documentation Skill\n\nUse when testing the multi-file html build\n\n## 📋 Document Information\n\n**Title:** The Web Handbook\n\n**Source files:** 2 HTML files\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_html_multi concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 4\n\n**Content Breakdown:**\n\n- **intro**: 2 sections\n- **extras**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n- Changelog\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Changelog** (1 sections):\n- Changelog (section 4)\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 4\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **HTML Files**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/golden_html_multi_s1-s2.md` - intro\n- `references/golden_html_multi_s3-s4.md` - extras\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | HTML Scraper\n","tests/golden/phase2/jupyter/SKILL.md":"---\nname: golden-jupyter\ndescription: Use when testing the golden_jupyter golden build\n---\n\n# Golden_Jupyter Notebook Skill\n\nUse when testing the golden_jupyter golden build\n\n## 📋 Notebook Information\n\n**Kernel:** Python 3\n\n**Language:** python 3.11.4\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **analysis**: 5 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/analysis.md` - analysis\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n","tests/golden/phase2/jupyter_dir/SKILL.md":"---\nname: golden-jupyter-dir\ndescription: Use when testing the golden_jupyter_dir golden build\n---\n\n# Golden_Jupyter_Dir Notebook Skill\n\nUse when testing the golden_jupyter_dir golden build\n\n## 📋 Notebook Information\n\n**Kernel:** Python 3\n\n**Language:** python 3.11.4\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter_dir concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **Data Loading**: 1 sections\n- **Evaluation**: 1 sections\n- **Setup**: 1 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s2-s2.md` - Data Loading\n- `references/section_s5-s5.md` - Evaluation\n- `references/section_s1-s1.md` - Setup\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n","tests/golden/phase2/jupyter_kw/SKILL.md":"---\nname: golden-jupyter-kw\ndescription: Use when testing the golden_jupyter_kw golden build\n---\n\n# Golden_Jupyter_Kw Notebook Skill\n\nUse when testing the golden_jupyter_kw golden build\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter_kw concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Modeling**: 1 sections\n- **Loading**: 1 sections\n- **Empty Cat**: 0 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s5-s5.md` - Modeling\n- `references/section_s2-s2.md` - Loading\n- `references/section_04.md` - Empty Cat\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n","tests/golden/phase2/jupyter_topics/SKILL.md":"---\nname: golden-jupyter-topics\ndescription: Use when testing the golden_jupyter_topics golden build\n---\n\n# Golden_Jupyter_Topics Notebook Skill\n\nUse when testing the golden_jupyter_topics golden build\n\n## 📋 Notebook Information\n\n**Kernel:** Python 3\n\n**Language:** python 3.11.4\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter_topics concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **Data Loading**: 1 sections\n- **Evaluation**: 1 sections\n- **Setup**: 1 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s2-s2.md` - Data Loading\n- `references/section_s5-s5.md` - Evaluation\n- `references/section_s1-s1.md` - Setup\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n","tests/golden/phase2/man/SKILL.md":"---\nname: golden-man\ndescription: Use when testing the man golden build\n---\n\n# Golden_Man Man Pages Skill\n\nUse when testing the man golden build\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_man command-line tools and their options\n- Look up command syntax and usage patterns\n- Find examples of common command invocations\n- Review available flags and environment variables\n- Explore related commands via SEE ALSO references\n\n## Quick Command Reference\n\n### git-log\n\n```\ngit log [<options>] [<revision-range>] [[--] <path>...]\n```\n\n### git-diff\n\n```\ngit diff [<options>] [<commit>] [--] [<path>...]\n```\n\n## Man Page Overview\n\n**Total Man Pages:** 3\n\n**Content Breakdown:**\n\n- **Git**: 2 man page(s)\n- **Curl**: 1 man page(s)\n\n## Common Options\n\n*3 options extracted across all man pages*\n\n### git-log\n\n- `-p` -- Generate patch output.\n- `--max-count=<number>` -- Limit the number of commits to output, interacting subtly with pathspec filtering, history simplification, and the --fol...\n\n### curl\n\n- `-s, --silent` -- Silent mode.\n\n## Examples\n\n*3 example(s) extracted from man pages*\n\n### git-log\n\nShow the last three commits\n\n```bash\ngit log -3\n```\n\n### git-log\n\nProse-only example with no command\n\n### curl\n\nFetch a page\n\n```bash\ncurl https://example.com\n```\n\n## Related Commands (SEE ALSO)\n\n- `git-diff`\n- `git-log`\n- `gitk`\n\n## Documentation Statistics\n\n- **Total Man Pages**: 3\n- **Total Options**: 3\n- **Total Examples**: 3\n- **Cross-references**: 3\n\n## Navigation\n\n**Reference Files:**\n\n- `references/git_01.md` -- Git\n- `references/curl_02.md` -- Curl\n\nSee `references/index.md` for complete reference structure.\n\n---\n\n**Generated by Skill Seekers** | Man Page Scraper\n","tests/golden/phase2/man_kw/SKILL.md":"---\nname: golden-man-kw\ndescription: Use when testing the man golden build\n---\n\n# Golden_Man_Kw Man Pages Skill\n\nUse when testing the man golden build\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_man_kw command-line tools and their options\n- Look up command syntax and usage patterns\n- Find examples of common command invocations\n- Review available flags and environment variables\n- Explore related commands via SEE ALSO references\n\n## Quick Command Reference\n\n### git-log\n\n```\ngit log [<options>] [<revision-range>] [[--] <path>...]\n```\n\n### git-diff\n\n```\ngit diff [<options>] [<commit>] [--] [<path>...]\n```\n\n## Man Page Overview\n\n**Total Man Pages:** 3\n\n**Content Breakdown:**\n\n- **Version Control**: 2 man page(s)\n- **Other**: 1 man page(s)\n\n## Common Options\n\n*3 options extracted across all man pages*\n\n### git-log\n\n- `-p` -- Generate patch output.\n- `--max-count=<number>` -- Limit the number of commits to output, interacting subtly with pathspec filtering, history simplification, and the --fol...\n\n### curl\n\n- `-s, --silent` -- Silent mode.\n\n## Examples\n\n*3 example(s) extracted from man pages*\n\n### git-log\n\nShow the last three commits\n\n```bash\ngit log -3\n```\n\n### git-log\n\nProse-only example with no command\n\n### curl\n\nFetch a page\n\n```bash\ncurl https://example.com\n```\n\n## Related Commands (SEE ALSO)\n\n- `git-diff`\n- `git-log`\n- `gitk`\n\n## Documentation Statistics\n\n- **Total Man Pages**: 3\n- **Total Options**: 3\n- **Total Examples**: 3\n- **Cross-references**: 3\n\n## Navigation\n\n**Reference Files:**\n\n- `references/version_control_01.md` -- Version Control\n- `references/other_02.md` -- Other\n\nSee `references/index.md` for complete reference structure.\n\n---\n\n**Generated by Skill Seekers** | Man Page Scraper\n","tests/golden/phase2/man_single/SKILL.md":"---\nname: golden-man-single\ndescription: Use when testing the man golden build\n---\n\n# Golden_Man_Single Man Pages Skill\n\nUse when testing the man golden build\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_man_single command-line tools and their options\n- Look up command syntax and usage patterns\n- Find examples of common command invocations\n- Review available flags and environment variables\n- Explore related commands via SEE ALSO references\n\n## Man Page Overview\n\n**Total Man Pages:** 1\n\n**Content Breakdown:**\n\n- **curl**: 1 man page(s)\n\n## Common Options\n\n*1 options extracted across all man pages*\n\n### curl\n\n- `-s, --silent` -- Silent mode.\n\n## Examples\n\n*1 example(s) extracted from man pages*\n\n### curl\n\nFetch a page\n\n```bash\ncurl https://example.com\n```\n\n## Documentation Statistics\n\n- **Total Man Pages**: 1\n- **Total Options**: 1\n- **Total Examples**: 1\n- **Cross-references**: 0\n\n## Navigation\n\n**Reference Files:**\n\n- `references/curl.md` -- curl\n\nSee `references/index.md` for complete reference structure.\n\n---\n\n**Generated by Skill Seekers** | Man Page Scraper\n","tests/golden/phase2/pdf/SKILL.md":"---\nname: golden-pdf\ndescription: Use when testing the pdf golden build\n---\n\n# Golden_Pdf Documentation Skill\n\nUse when testing the pdf golden build\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pdf concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Chapter Overview\n\n**Total Pages:** 3\n\n**Content Breakdown:**\n\n- **manual**: 3 pages\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (page 1)\n\n**Installation** (1 sections):\n- Installation Steps (page 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (page 3)\n\n**Usage** (1 sections):\n- API Usage (page 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Documentation Statistics\n\n- **Total Pages**: 3\n- **Code Blocks**: 4\n- **Images/Diagrams**: 2\n- **Programming Languages**: 3\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n- text: 1 examples\n\n**Code Quality:**\n\n- Average Quality Score: 7.4/10\n- Valid Code Blocks: 4\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/manual.md` - manual\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | PDF Documentation Scraper\n","tests/golden/phase2/pdf_chapters/SKILL.md":"---\nname: golden-pdf-ch\ndescription: Use when testing chapter categorization\n---\n\n# Golden_Pdf_Ch Documentation Skill\n\nUse when testing chapter categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pdf_ch concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Chapter Overview\n\n**Total Pages:** 4\n\n**Content Breakdown:**\n\n- **Chapter 1: Basics**: 2 pages\n- **Chapter 2: Advanced**: 1 pages\n- **Additional Content**: 1 pages\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (page 1)\n\n**Installation** (1 sections):\n- Installation Steps (page 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (page 3)\n\n**Usage** (1 sections):\n- API Usage (page 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Documentation Statistics\n\n- **Total Pages**: 4\n- **Code Blocks**: 4\n- **Images/Diagrams**: 2\n- **Programming Languages**: 3\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n- text: 1 examples\n\n**Code Quality:**\n\n- Average Quality Score: 7.4/10\n- Valid Code Blocks: 4\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_p1-p2.md` - Chapter 1: Basics\n- `references/section_p3-p3.md` - Chapter 2: Advanced\n- `references/section_p4-p4.md` - Additional Content\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | PDF Documentation Scraper\n","tests/golden/phase2/pdf_kw/SKILL.md":"---\nname: golden-pdf-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Pdf_Kw Documentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pdf_kw concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Chapter Overview\n\n**Total Pages:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 pages\n- **Api**: 1 pages\n- **Deployment**: 0 pages\n- **Other**: 1 pages\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (page 1)\n\n**Installation** (1 sections):\n- Installation Steps (page 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (page 3)\n\n**Usage** (1 sections):\n- API Usage (page 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Documentation Statistics\n\n- **Total Pages**: 3\n- **Code Blocks**: 4\n- **Images/Diagrams**: 2\n- **Programming Languages**: 3\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n- text: 1 examples\n\n**Code Quality:**\n\n- Average Quality Score: 7.4/10\n- Valid Code Blocks: 4\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_p1-p1.md` - Setup\n- `references/section_p2-p2.md` - Api\n- `references/section_03.md` - Deployment\n- `references/section_p3-p3.md` - Other\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | PDF Documentation Scraper\n","tests/golden/phase2/pptx/SKILL.md":"---\nname: golden-pptx\ndescription: Use when testing the pptx golden build\n---\n\n# Golden_Pptx Presentation Skill\n\nUse when testing the pptx golden build\n\n## 📋 Presentation Information\n\n**Title:** The Deck\n\n**Author:** Jane Doe\n\n**Subject:** Quarterly architecture review\n\n**Category:** Engineering\n\n**Created:** 2024-01-01\n\n**Modified:** 2024-03-03\n\n**Slides:** 8\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pptx concepts and fundamentals\n- Review presentation content and key points\n- Find code examples and implementation patterns\n- Access speaker notes and additional context\n- Reference tables and data from the presentation\n\n## 📖 Section Overview\n\n**Total Slides:** 8\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **deck**: 3 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this presentation*\n\n**Major Sections:**\n\n- Getting Started Guide\n- Summary and Q&A\n\n**Subsections:**\n\n- Installation Steps\n- Architecture Overview\n\n## ⚡ Quick Reference\n\n*Common presentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Overview** (1 sections):\n- Architecture Overview (section 2)\n\n**Summary** (1 sections):\n- Summary and Q&A (section 3)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from presentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in presentation*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: Architecture Overview**\n\n## 📊 Presentation Statistics\n\n- **Total Slides**: 8\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/deck.md` - deck\n\nSee `references/index.md` for complete presentation structure.\n\n---\n\n**Generated by Skill Seeker** | PowerPoint Presentation Scraper\n","tests/golden/phase2/pptx_kw/SKILL.md":"---\nname: golden-pptx-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Pptx_Kw Presentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pptx_kw concepts and fundamentals\n- Review presentation content and key points\n- Find code examples and implementation patterns\n- Access speaker notes and additional context\n- Reference tables and data from the presentation\n\n## 📖 Section Overview\n\n**Total Slides:** 8\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Api**: 1 sections\n- **Other**: 1 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this presentation*\n\n**Major Sections:**\n\n- Getting Started Guide\n- Architecture Overview\n- Summary and Q&A\n\n**Slide Topics:**\n\n- Slide 2: Verify Setup\n- Slide 3: First Demo\n- Slide 8: Common Errors\n\n## ⚡ Quick Reference\n\n*Common presentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Overview** (1 sections):\n- Architecture Overview (section 2)\n\n**Summary** (1 sections):\n- Summary and Q&A (section 3)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from presentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in presentation*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: Architecture Overview**\n\n## 📊 Presentation Statistics\n\n- **Total Slides**: 8\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s2-s2.md` - Api\n- `references/section_s3-s3.md` - Other\n\nSee `references/index.md` for complete presentation structure.\n\n---\n\n**Generated by Skill Seeker** | PowerPoint Presentation Scraper\n","tests/golden/phase2/rss/SKILL.md":"---\nname: golden-rss\ndescription: Use when testing the rss golden build\n---\n\n# Example Engineering Blog Feed Skill\n\nUse when testing the rss golden build\n\n## 📡 Feed Information\n\n**Feed Title:** Example Engineering Blog\n\n**Feed Type:** RSS 2.0\n\n**Website:** https://example.com\n\n**Language:** en-us\n\n**Description:** A feed description that is intentionally longer than the three hundred character limit applied in the Feed Information block of SKILL.md. A feed description that is intentionally longer than the three hundred character limit applied in the Feed Information block of SKILL.md. A feed description th...\n\n**Generator:** ExampleCMS 2.0\n\n**Rights:** © Example Inc.\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Reference articles and content from Example Engineering Blog\n- Look up specific topics covered in the feed\n- Find author perspectives and expert analysis\n- Review recent posts and updates on the subject\n- Explore categorized content by tags or topics\n\n## 📖 Article Overview\n\n**Total Articles:** 4\n\n**Content by Category:**\n\n- **Dev Ops**: 1 articles\n- **Python**: 1 articles\n- **uncategorized**: 1 articles\n- **★★★**: 1 articles\n\n## 📰 Recent Articles\n\n### Continuous Delivery in Practice\n\n**Published:** Mon, 01 Jan 2024 10:00:00 GMT | **Author:** Jane Doe\n\nThis is a deliberately long summary that keeps going well past the two hundred character truncation threshold used by the recent-articles block of SKILL.md so that the shortened form with a trailing e...\n\n[Read more](https://example.com/posts/cd-in-practice)\n\n### Typing Tips for Python\n\n**Published:** Fri, 15 Mar 2024 08:30:00 GMT | **Author:** John Roe\n\nShort notes on gradual typing.\n\n[Read more](https://example.com/posts/typing-tips)\n\n### An Uncategorized Note\n\n**Author:** Jane Doe\n\nA note without tags.\n\n### Symbols Only\n\n**Published:** Sat, 10 Feb 2024 12:00:00 GMT\n\n[Read more](https://example.com/posts/symbols)\n\n## ✍️ Authors (2)\n\n- **Jane Doe**: 2 articles\n- **John Roe**: 1 articles\n\n## 🏷️ Tags (55)\n\n`Dev Ops`, `Python`, `dev-ops`, `tag00`, `tag01`, `tag02`, `tag03`, `tag04`, `tag05`, `tag06`, `tag07`, `tag08`, `tag09`, `tag10`, `tag11`, `tag12`, `tag13`, `tag14`, `tag15`, `tag16`, `tag17`, `tag18`, `tag19`, `tag20`, `tag21`, `tag22`, `tag23`, `tag24`, `tag25`, `tag26`, `tag27`, `tag28`, `tag29`, `tag30`, `tag31`, `tag32`, `tag33`, `tag34`, `tag35`, `tag36`, `tag37`, `tag38`, `tag39`, `tag40`, `tag41`, `tag42`, `tag43`, `tag44`, `tag45`, `tag46` ... and 5 more\n\n## 📊 Feed Statistics\n\n- **Total Articles**: 4\n- **Feed Type**: RSS 2.0\n- **Categories/Tags**: 55\n- **Authors**: 2\n- **Full Content Scraped**: Yes\n\n- **Date Range**: 2024-01-01 to 2024-03-15\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/dev_ops.md` - Dev Ops (1 articles)\n- `references/python.md` - Python (1 articles)\n- `references/uncategorized.md` - uncategorized (1 articles)\n- `references/unnamed.md` - ★★★ (1 articles)\n\nSee `references/index.md` for complete feed structure.\n\n---\n\n**Generated by Skill Seeker** | RSS/Atom Feed Scraper\n","tests/golden/phase2/rss_empty/SKILL.md":"---\nname: golden-rss-empty\ndescription: Use when testing the empty rss golden build\n---\n\n# Quiet Feed Feed Skill\n\nUse when testing the empty rss golden build\n\n## 📡 Feed Information\n\n**Feed Title:** Quiet Feed\n\n**Feed Type:** Atom\n\n**Website:** https://example.com/quiet\n\n**Description:** A feed with no entries yet.\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Reference articles and content from Quiet Feed\n- Look up specific topics covered in the feed\n- Find author perspectives and expert analysis\n- Review recent posts and updates on the subject\n- Explore categorized content by tags or topics\n\n## 📖 Article Overview\n\n**Total Articles:** 0\n\n**Content by Category:**\n\n- **All Articles**: 0 articles\n\n## 📊 Feed Statistics\n\n- **Total Articles**: 0\n- **Feed Type**: Atom\n- **Categories/Tags**: 0\n- **Authors**: 0\n- **Full Content Scraped**: No\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/all_articles.md` - All Articles (0 articles)\n\nSee `references/index.md` for complete feed structure.\n\n---\n\n**Generated by Skill Seeker** | RSS/Atom Feed Scraper\n","tests/golden/phase2/word/SKILL.md":"---\nname: golden-word\ndescription: Use when testing the word golden build\n---\n\n# Golden_Word Documentation Skill\n\nUse when testing the word golden build\n\n## 📋 Document Information\n\n**Title:** The Manual\n\n**Author:** John Roe\n\n**Created:** 2023-05-05\n\n**Modified:** 2024-02-02\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_word concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **manual**: 3 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 1\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/manual.md` - manual\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | Word Document Scraper\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# AGENTS.md - Skill Seekers\n\nComprehensive 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.\n\n## Project Overview\n\n**Skill Seekers** is a universal preprocessing layer that transforms raw documentation and code into structured knowledge assets. It supports 17+ source types and exports to 21+ AI platforms including Claude, Gemini, OpenAI, LangChain, LlamaIndex, and various vector databases.\n\n### Key Capabilities\n- **Source Types (17):** Documentation websites, GitHub repos, PDFs, Word docs, EPUBs, videos, local codebases, Jupyter notebooks, HTML, OpenAPI specs, AsciiDoc, PowerPoint, Confluence, Notion, RSS feeds, man pages, chat exports\n- **Export Targets (21):** Claude, Gemini, OpenAI, MiniMax, OpenCode, Kimi, DeepSeek, Qwen, OpenRouter, Together AI, Fireworks AI, Markdown, LangChain, LlamaIndex, Haystack, Weaviate, ChromaDB, FAISS, Qdrant, Pinecone\n- **MCP Server:** FastMCP-based Model Context Protocol server for AI assistant integration\n\n## Setup\n\n```bash\n# REQUIRED before running tests (src/ layout — tests hard-exit if package not installed)\npip install -e .\n\n# With dev tools (pytest, ruff, mypy, coverage)\npip install -e \".[dev]\"\n\n# With specific LLM platform support\npip install -e \".[gemini]\"      # Google Gemini\npip install -e \".[openai]\"      # OpenAI ChatGPT\npip install -e \".[all-llms]\"    # All LLM platforms\n\n# With all optional dependencies (except video-full)\npip install -e \".[all]\"\n\n# Full video processing (heavy dependencies)\npip install -e \".[video-full]\"\n```\n\nNote: `tests/conftest.py` checks that `skill_seekers` is importable and calls `sys.exit(1)` if not. Always install in editable mode first.\n\n### Environment Variables\n\nCreate a `.env` file or export these variables:\n```bash\nANTHROPIC_API_KEY      # For Claude AI enhancement\nGOOGLE_API_KEY         # For Gemini support\nOPENAI_API_KEY         # For OpenAI support\nGITHUB_TOKEN           # For GitHub repo scraping (higher rate limits)\n```\n\n## Build / Test / Lint\n\n```bash\n# Full suite (never skip — all must pass)\npytest tests/ -v\n\n# Fast iteration (skip slow, integration, E2E, network, MCP)\npytest tests/ -m \"not slow and not integration and not e2e and not network and not serial and not mcp_only\" -q\n\n# Fast parallel (install pytest-xdist first)\npytest 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\n\n# 3-phase runner script (recommended for local dev)\nbash scripts/run_tests_fast.sh\n\n# Single test\npytest tests/test_scraper_features.py::test_detect_language -v\n\n# Skip slow/integration\npytest tests/ -v -m \"not slow and not integration\"\n\n# With coverage\npytest tests/ --cov=src/skill_seekers --cov-report=term\n\n# Lint + format check (matches CI)\nruff check src/ tests/\nruff format --check src/ tests/\n\n# Type check (non-blocking — mypy is continue-on-error in CI)\nmypy src/skill_seekers --show-error-codes --pretty\n```\n\n**Pytest config:** `asyncio_mode = \"auto\"`, so `@pytest.mark.asyncio` is implicit. Test markers: `slow`, `integration`, `e2e`, `venv`, `bootstrap`, `benchmark`, `asyncio`, `serial`, `network`, `mcp_only`.\n\n**CI note:** CI pins `ruff==0.15.8` (not the `>=0.14.13` dev dep). If formatting behaves differently locally, check the CI version.\n\n**CI test phases:** Tests are split into 3 parallel jobs:\n- `test-fast` — 3386 unit tests with xdist across OS/Python matrix\n- `test-serial` — 69 serial/integration/E2E/network tests\n- `test-mcp` — 193 MCP tests (requires `[mcp]` extras)\n\n## Code Style\n\n### Formatting Rules (ruff — from pyproject.toml)\n- **Line length:** 100 characters\n- **Target Python:** 3.10+\n- **Enabled lint rules:** E, W, F, I, B, C4, UP, ARG, SIM\n- **Ignored rules:** E501 (line length handled by formatter), F541 (f-string style), ARG002 (unused method args for interface compliance), B007 (intentional unused loop vars), I001 (formatter handles imports), SIM114 (readability preference)\n\n### Imports\n- Sort with isort (via ruff); `skill_seekers` is first-party\n- Standard library → third-party → first-party, separated by blank lines\n- Use `from __future__ import annotations` only if needed for forward refs\n- Guard optional imports with try/except ImportError (see `adaptors/__init__.py` pattern):\n  ```python\n  try:\n      from .claude import ClaudeAdaptor\n      from .minimax import MiniMaxAdaptor\n  except ImportError:\n      ClaudeAdaptor = None\n      MiniMaxAdaptor = None\n  ```\n\n### Naming Conventions\n- **Files:** `snake_case.py` (e.g., `source_detector.py`, `config_validator.py`)\n- **Classes:** `PascalCase` (e.g., `SkillAdaptor`, `ClaudeAdaptor`, `SourceDetector`)\n- **Functions/methods:** `snake_case` (e.g., `get_adaptor()`, `detect_language()`)\n- **Constants:** `UPPER_CASE` (e.g., `ADAPTORS`, `DEFAULT_CHUNK_TOKENS`, `VALID_SOURCE_TYPES`)\n- **Private:** prefix with `_` (e.g., `_read_existing_content()`, `_validate_unified()`)\n\n### Type Hints\n- Gradual typing — add hints where practical, not enforced everywhere\n- Use modern syntax: `str | None` not `Optional[str]`, `list[str]` not `List[str]`\n- MyPy config: `disallow_untyped_defs = false`, `check_untyped_defs = true`, `ignore_missing_imports = true`\n- Tests are excluded from strict type checking (`disallow_untyped_defs = false`, `check_untyped_defs = false` for `tests.*`)\n\n### Docstrings\n- Module-level docstring on every file (triple-quoted, describes purpose)\n- Google-style docstrings for public functions/classes\n- Include `Args:`, `Returns:`, `Raises:` sections where useful\n\n### Error Handling\n- Use specific exceptions, never bare `except:`\n- Provide helpful error messages with context\n- Use `raise ValueError(...)` for invalid arguments, `raise RuntimeError(...)` for state errors\n- Guard optional dependency imports with try/except and give clear install instructions on failure\n- Chain exceptions with `raise ... from e` when wrapping\n\n### Suppressing Lint Warnings\n- Use inline `# noqa: XXXX` comments (e.g., `# noqa: F401` for re-exports, `# noqa: ARG001` for required but unused params)\n\n## Project Layout\n\n```\nsrc/skill_seekers/           # Main package (src/ layout)\n  cli/                       # CLI commands and entry points (100+ files)\n    adaptors/                # Platform adaptors (Strategy pattern, inherit SkillAdaptor)\n    arguments/               # CLI argument definitions (one per source type)\n    parsers/                 # Subcommand parsers (one per source type)\n    storage/                 # Cloud storage (inherit BaseStorageAdaptor)\n    main.py                  # Unified CLI entry point (COMMAND_MODULES dict)\n    source_detector.py       # Auto-detects source type from user input\n    create_command.py        # Unified `create` command routing\n    config_validator.py      # VALID_SOURCE_TYPES set + per-type validation\n    unified_scraper.py       # Multi-source orchestrator (scraped_data + dispatch)\n    unified_skill_builder.py # Pairwise synthesis + generic merge\n  mcp/                       # MCP server (FastMCP + legacy)\n    tools/                   # MCP tool implementations by category (10 files)\n    server_fastmcp.py        # FastMCP server implementation\n    server_legacy.py         # Legacy MCP server\n  sync/                      # Sync monitoring (Pydantic models)\n  benchmark/                 # Benchmarking framework\n  embedding/                 # FastAPI embedding server\n  workflows/                 # 67 YAML workflow presets\n  _version.py                # Reads version from pyproject.toml\ntests/                       # 160 test files (pytest)\n  test_adaptors/             # 22 adaptor-specific test files\n  conftest.py                # Test configuration with package check\nconfigs/                     # Preset JSON scraping configs\ndocs/                        # Documentation (guides, integrations, architecture)\n```\n\n## Key Patterns\n\n**Adaptor (Strategy) pattern** — all platform logic in `cli/adaptors/`. Inherit `SkillAdaptor`, implement `format_skill_md()`, `package()`, `upload()`. Register in `adaptors/__init__.py` ADAPTORS dict.\n\n**Scraper pattern** — each source type has: `cli/<type>_scraper.py` (with `<Type>ToSkillConverter` class + `main()`), `arguments/<type>.py`, `parsers/<type>_parser.py`. Register in `parsers/__init__.py` PARSERS list, `main.py` COMMAND_MODULES dict, `config_validator.py` VALID_SOURCE_TYPES set.\n\n**Unified pipeline** — `unified_scraper.py` dispatches to per-type `_scrape_<type>()` methods. `unified_skill_builder.py` uses pairwise synthesis for docs+github+pdf combos and `_generic_merge()` for all other combinations.\n\n**MCP tools** — grouped in `mcp/tools/` by category. `scrape_generic_tool` handles all new source types.\n\n**CLI subcommands** — git-style in `cli/main.py`. Each delegates to a module's `main()` function.\n\n**Supported source types (17):** documentation (web), github, pdf, local, word, video, epub, jupyter, html, openapi, asciidoc, pptx, confluence, notion, rss, manpage, chat. Each detected automatically by `source_detector.py`.\n\n**Supported platforms (21):** claude, gemini, openai, minimax, opencode, kimi, deepseek, qwen, openrouter, together, fireworks, markdown, langchain, llama-index, haystack, weaviate, chroma, faiss, qdrant, pinecone.\n\n## Web UI (Seeker HUD) — beta\n\n**Status: beta** (since 3.10.0). Screens, API routes and `~/.skill-seekers/ui/` state may change between minor releases; the CLI and MCP server are unaffected.\n\nLocal web app: React 19 + Vite + Tailwind/shadcn frontend in `ui/`, FastAPI backend in `src/skill_seekers/web/`.\n\n```bash\n# Run the app (opens browser; API on :8770)\nskill-seekers ui\n\n# Frontend dev mode (hot reload, proxies /api to :8770)\ncd ui && npm install && npm run dev\n\n# Build frontend (Vite outputs to src/skill_seekers/web/dist, which the\n# backend serves and the wheel bundles as package-data)\ncd ui && npm run build\n```\n\n- Backend deps: `pip install -e \".[ui]\"` (fastapi + uvicorn; also in `[all]` and dev group)\n- **Packaging:** the built SPA is bundled into the wheel from `src/skill_seekers/web/dist` (gitignored; the release workflow runs `npm run build` before `uv build`). `skill-seekers ui` warns if the frontend hasn't been built.\n- Jobs run as subprocesses (`python -m skill_seekers.web.runner`) with streamed logs + `[[PROGRESS:nn]]` markers\n- UI state: `~/.skill-seekers/ui/` (jobs, projects, activity, skill overrides, settings)\n- API tests: `tests/test_web_api.py`\n\n## CLI Commands\n\n```bash\n# Core commands\nskill-seekers create <source>              # Create skill from any source (auto-detects type)\nskill-seekers create <source> --index      # ...plus an opt-in SQLite search index + scripts/search.py\nskill-seekers scan <dir>                   # AI-detect a project's tech stack and emit per-framework configs\nskill-seekers enhance <directory>          # AI-powered enhancement\nskill-seekers package <directory>          # Package skill for target platform\nskill-seekers upload <file>                # Upload skill to target platform\nskill-seekers install <source>             # One-command workflow (scrape + enhance + package + upload)\n\n# Utilities\nskill-seekers estimate <source>            # Estimate page count before scraping\nskill-seekers detect <source> [--json]     # Read-only: how create would classify a source (exit 2 if invalid)\nskill-seekers doctor [--json]              # Health check for dependencies (--json for CI/agents)\nskill-seekers config                       # Configure API keys and settings\nskill-seekers workflows                    # List and apply workflow presets\nskill-seekers resume <job_id>              # Resume interrupted scraping\n\n# Advanced\nskill-seekers stream <source>              # Streaming ingestion\nskill-seekers update <directory>           # Incremental update\nskill-seekers multilang <directory>        # Multi-language support\n```\n\n## Testing Instructions\n\n### Test Structure\n- Unit tests: `tests/test_*.py` — test individual modules\n- Adaptor tests: `tests/test_adaptors/test_*_adaptor.py` — test platform adaptors\n- E2E tests: `tests/test_*_e2e.py` — end-to-end integration tests\n\n### Running Tests\n```bash\n# Fast test run (skip slow/integration tests)\npytest tests/ -v -m \"not slow and not integration\"\n\n# Full test suite\npytest tests/ -v\n\n# With coverage report\npytest tests/ --cov=src/skill_seekers --cov-report=term-missing\n\n# Specific test categories\npytest tests/ -v -m \"slow\"           # Only slow tests\npytest tests/ -v -m \"integration\"    # Only integration tests\npytest tests/ -v -m \"e2e\"            # Only E2E tests\n```\n\n### Test Fixtures\nTest fixtures are located in `tests/fixtures/` and include sample configs, HTML files, and mock data.\n\n## Git Workflow\n\n- **`main`** — production, protected\n- **`development`** — default PR target, active dev\n- Feature branches created from `development`\n\n## Pre-commit Checklist\n\n```bash\nruff check src/ tests/\nruff format --check src/ tests/\npytest tests/ -v -x   # stop on first failure\n```\n\nNever commit API keys. Use env vars: `ANTHROPIC_API_KEY`, `GOOGLE_API_KEY`, `OPENAI_API_KEY`, `GITHUB_TOKEN`.\n\n## CI/CD\n\nGitHub Actions (7 workflows in `.github/workflows/`):\n- **tests.yml** — ruff + mypy lint job, then pytest matrix (Ubuntu + macOS, Python 3.10-3.12) with Codecov upload\n- **release.yml** — tag-triggered: tests → version verification → PyPI publish via `uv build`\n- **test-vector-dbs.yml** — tests vector DB adaptors (weaviate, chroma, faiss, qdrant)\n- **docker-publish.yml** — multi-platform Docker builds (amd64, arm64) for CLI + MCP images\n- **quality-metrics.yml** — quality analysis with configurable threshold\n- **scheduled-updates.yml** — weekly skill updates for popular frameworks\n- **vector-db-export.yml** — weekly vector DB exports\n\n## Deployment\n\n### Docker\nMulti-stage Dockerfile with Python 3.12 slim base:\n```bash\n# Build CLI image\ndocker build -t skill-seekers:local -f Dockerfile .\n\n# Run CLI\ndocker run -v $(pwd)/output:/output skill-seekers:local create https://docs.example.com\n\n# Run MCP server\ndocker build -t skill-seekers-mcp:local -f Dockerfile.mcp .\ndocker run -p 8765:8765 skill-seekers-mcp:local\n```\n\n### MCP Server\nThe MCP server provides Model Context Protocol integration:\n```bash\n# Start FastMCP server\nskill-seekers-mcp\n\n# Or use the Python module\npython -m skill_seekers.mcp.server_fastmcp\n```\n\n## Security Considerations\n\n- **API Keys:** Never commit API keys to version control. Use environment variables or `.env` files (already in `.gitignore`)\n- **Docker:** Runs as non-root user (`skillseeker`, UID 1000)\n- **Dependencies:** Regular security updates via `pip audit` or `safety check`\n- **Sandboxing:** Video processing uses optional dependencies that can be heavy; install `[video-full]` only when needed\n\n## Additional Resources\n\n- **Website:** https://skillseekersweb.com/\n- **Documentation:** https://skillseekersweb.com/\n- **PyPI:** https://pypi.org/project/skill-seekers/\n- **Repository:** https://github.com/yusufkaraaslan/Skill_Seekers\n- **Config Browser:** https://skillseekersweb.com/\n- **Project Board:** https://github.com/users/yusufkaraaslan/projects/2\n","isInternal":false,"tokens":3876,"sizeBytes":15251},{"name":"CLAUDE.md","path":"CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/CLAUDE.md","title":"Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\n**Skill Seekers** converts documentation from 18 source types into production-ready formats for 21+ AI platforms (LLM platforms, RAG frameworks, vector databases, AI coding assistants). Published on PyPI as `skill-seekers`.\n\n**Version:** 3.11.0 (dev; last release 3.10.0) — source of truth is `src/skill_seekers/_version.py` | **Python:** 3.10+ | **Website:** https://skillseekersweb.com/\n\n**Architecture:** See `docs/UML_ARCHITECTURE.md` for UML diagrams and module overview. StarUML project at `docs/UML/skill_seekers.mdj`. Refactor state/history: `docs/UNIFICATION_PLAN.md` (Grand Unification — all 5 phases done; remaining cosmetic items listed there).\n\n## Essential Commands\n\n```bash\n# REQUIRED before running tests or CLI (src/ layout)\npip install -e .\n\n# Run all tests (NEVER skip - all must pass before commits)\npytest tests/ -v\n\n# Fast iteration (skip slow MCP tests ~20min)\npytest tests/ --ignore=tests/test_mcp_fastmcp.py --ignore=tests/test_mcp_server.py --ignore=tests/test_install_skill_e2e.py -q\n\n# Single test\npytest tests/test_scraper_features.py::test_detect_language -vv -s\n\n# Code quality (must pass before push - matches CI)\nuvx ruff check src/ tests/\nuvx ruff format --check src/ tests/\nmypy src/skill_seekers  # continue-on-error in CI\n\n# Auto-fix lint/format issues\nuvx ruff check --fix --unsafe-fixes src/ tests/\nuvx ruff format src/ tests/\n\n# Build & publish\nuv build\nuv publish\n```\n\n## CI Matrix\n\nRuns on push/PR to `main` or `development`. Lint job (Python 3.12, Ubuntu) + Test job (Ubuntu + macOS, Python 3.10/3.11/3.12, excludes macOS+3.10). Both must pass for merge.\n\n## Git Workflow\n\n- **Main branch:** `main` (requires tests + 1 review)\n- **Development branch:** `development` (default PR target, requires tests)\n- **Feature branches:** `feature/{task-id}-{description}` from `development`\n- PRs always target `development`, never `main` directly\n\n## Architecture\n\n### CLI: Unified create command\n\nEntry point `src/skill_seekers/cli/main.py`. The `create` command is the **primary** entry point for skill creation — it auto-detects source type and routes to the appropriate `SkillConverter`. The `scan` command (added in #327) is a separate discovery step for projects with multiple frameworks; it emits one config file per detected framework and you then run `create` on each.\n\n```\nskill-seekers create <source>     # Auto-detect: URL, owner/repo, ./path, file.pdf, etc.\nskill-seekers scan <dir>          # AI-driven discovery → emits one config per detected framework + <project>-codebase.json\nskill-seekers package <dir>       # Package for platform (--target claude/gemini/openai/markdown/minimax/opencode/kimi/deepseek/qwen/openrouter/together/fireworks/atlas/langchain/llama-index/haystack/chroma/faiss/weaviate/qdrant/pinecone/ibm-bob)\n```\n\n### Scan command (issue #327)\n\n`skill-seekers scan <dir>` is an AI-driven project knowledge-base bootstrapper. Pipeline in `src/skill_seekers/cli/scan_command.py`:\n\n1. `collect_signals()` in `signal_collectors.py` — deterministic, bounded gathering of manifests + README + Dockerfile/CI + sampled source files + git remote. **Per-kind byte budgets** (24 KB manifest / 6 KB README / 6 KB CI / 28 KB samples, total 64 KB) so a fat package.json can't crowd out other kinds. `_SOURCE_DIRS` covers ~14 layouts (Go `cmd/`, Rust `crates/`, JS monorepo `apps/packages/`, Maven `source/`, Django at root); also walks root one level deep for flat-layout Python.\n2. `detect_with_ai(bundle, AgentClient)` — one LLM call, structured JSON output. **Source signals are first-2-KB of each file** (whole-file sampling, no regex parsing — added in WS4 because regex missed Go multi-line imports + Rust `mod`/`extern crate`). Canonical-slug prompt + the canonical-name resolver are coupled — change one, update the other.\n3. `resolve_or_generate_with_status()` — for each detection: try `out_dir/<slug>.json` (cache from prior run), then `resolve_config_path` from `config_fetcher` with multiple canonical name candidates (`_canonical_name_candidates` handles `\"Godot Engine\"` → `\"godot\"`, plus CJK / European suffixes like `\"Godot 引擎\"`, `\"React フレームワーク\"`, `\"Lodash Bibliothek\"`), then `generate_config_with_ai` as the last resort. Always appends `.json` to lookup names so local-disk and user-dir resolution actually finds files. Always stamps `metadata.detected_version` (nested, not top-level — `metadata.version` already exists and means config-schema version).\n4. `emit_codebase_config()` — always writes `<project>-codebase.json` (a `type: local` source pointed at the project root).\n5. `diff_against_existing()` — keyed by **filename slug** (not internal `data[\"name\"]`) so re-scans don't churn when the AI returns a display name vs the registry canonical slug.\n6. `_archive_removed()` — when a config disappears from detections, MOVE (not delete — user may have hand-edited) to `out_dir/.archived/<UTC-timestamp>/`. Runs after diff, before fresh writes.\n7. `maybe_publish()` — **native async** (WS11). Opt-in submission of freshly AI-generated configs to the community registry. Pre-checks `GITHUB_TOKEN`. Idempotency guard: `_find_existing_issue` queries GitHub Search API for an existing open issue with the same config name before submitting. Retries transient failures (rate limit, 5xx) with 0s/5s/15s backoff. `_prompt_async` wraps `input()` via `asyncio.to_thread` so the event loop isn't blocked.\n\n**CLI dispatch** uses the `COMMAND_CLASSES` table in `main.py` (added in WS1). `scan` and `doctor` are dispatched as `Cls(args).execute()` consuming the parsed argparse namespace directly — no `_reconstruct_argv` hack, no duplicate argparse. `ScanCommand.execute()` is the single `asyncio.run` boundary wrapping `run_scan` (sync) + `maybe_publish` (async). Remaining ~14 commands still use the legacy `COMMAND_MODULES` dispatch; they're flagged for migration.\n\n**Cost guardrails**: `--max-ai-generations N` (default 10) caps unbounded AI generation; `--dry-run` previews without writing or invoking AI; `--probe-urls` HEAD-checks AI-generated URLs with retry-on-404 and stamps `metadata._url_unverified` on confirmed-bad URLs.\n\n**Safety**: All writes use `_atomic_write_json` (`os.replace` after writing to `.tmp`) so a `KeyboardInterrupt` mid-write can't corrupt configs. `_safe_size` guards `stat()` so broken symlinks don't crash the scan. `ScanCommand.execute` calls `logging.basicConfig` so `logger.warning`/`error` is visible; exit code is non-zero when no configs and no codebase config were emitted.\n\n**Public constant**: `SourceDetector.CODE_PROJECT_MARKERS` (was `_CODE_PROJECT_MARKERS`) — shared between source_detector + signal_collectors. ~50 manifest types now (Pipfile, environment.yml, deno.json, flake.nix, Chart.yaml, deps.edn, dune-project, BUILD.bazel, …). Public so cross-module access doesn't reach into a private attribute.\n\n### SkillConverter Pattern (Template Method + Factory)\n\nAll 18 source types implement the `SkillConverter` base class (`skill_converter.py`):\n\n```python\nconverter = get_converter(\"web\", config)  # Factory lookup\nconverter.run()  # Template: extract() → build_skill()\n```\n\nRegistry in `CONVERTER_REGISTRY` maps source type → (module, class). `create_command.py` builds config from `ExecutionContext`, calls `get_converter()`, then runs centralized enhancement. `get_converter(\"config\", {...})` constructs `UnifiedScraper` from the same factory-shaped dict (no special cases in create_command/MCP). The base resolves `skill_dir` once (strips trailing separators) and derives `data_file` via `data_file_for()` — subclasses must not re-derive paths.\n\n### DocumentSkillBuilder (build side of 9 document scrapers)\n\n`cli/document_skill_builder.py:DocumentSkillBuilder` sits between `SkillConverter` and the 9 document scrapers (epub, word, pptx, html, pdf, jupyter, man, rss, chat). It owns `categorize_content`, reference-file writing (tables, truncation, image guard), `index.md` + `SKILL.md` generation, and `load_extracted_data`. Variation points are class attrs (`DOC_NOUN`, `SOURCE_LABEL`, `LOAD_TOTAL_KEY`, `PATTERN_KEYWORDS`, `RANGE_LABEL`, …) and small hook methods (`category_stem`, `_write_reference_section`, `_write_skill_md_metadata`). Output is pinned **byte-identical** by golden trees in `tests/golden/phase2/` — `UPDATE_GOLDENS=1` rewrites them, only do that deliberately. Surviving full-method overrides are domain-shaped and commented per scraper.\n\n### UnifiedScraper (multi-source configs)\n\n`unified_scraper.py` dispatches via the class-level `SOURCE_DISPATCH` table; `_scrape_with_converter()` is the shared engine for the 13 mechanical source types (`get_converter()` + public `converter.extract()` + cache copy + sub-skill build), so **new types registered in `CONVERTER_REGISTRY` work in unified configs automatically**. documentation/github/local stay bespoke (commented why). `run()` deliberately does NOT follow the base template (TestRunOrchestration pins that run() triggers workflows).\n\n### Data Flow (5 phases)\n\n1. **Scrape** - Source-specific scraper extracts content to `output/{name}_data/pages/*.json`\n2. **Build** - `build_skill()` categorizes pages, extracts patterns, generates `output/{name}/SKILL.md`\n3. **Enhance** (optional) - LLM rewrites SKILL.md (`--enhance-level 0-3`, auto-detects API vs LOCAL mode)\n4. **Package** - Platform adaptor formats output (`.zip`, `.tar.gz`, JSON, vector index)\n5. **Upload** (optional) - Platform API upload\n\n### Platform Adaptor Pattern (Strategy + Factory)\n\nFactory: `get_adaptor(platform, config)` in `adaptors/__init__.py` returns a `SkillAdaptor` instance. Base class `SkillAdaptor` + `SkillMetadata` in `adaptors/base.py`.\n\n```\nsrc/skill_seekers/cli/adaptors/\n├── __init__.py              # Factory: get_adaptor(platform, config), ADAPTORS registry\n├── base.py                  # Abstract base: SkillAdaptor, SkillMetadata\n├── openai_compatible.py     # Shared base for OpenAI-compatible platforms\n├── claude.py                # --target claude\n├── gemini.py                # --target gemini\n├── openai.py                # --target openai\n├── markdown.py              # --target markdown\n├── minimax.py               # --target minimax\n├── opencode.py              # --target opencode\n├── kimi.py                  # --target kimi\n├── deepseek.py              # --target deepseek\n├── qwen.py                  # --target qwen\n├── openrouter.py            # --target openrouter\n├── together.py              # --target together\n├── fireworks.py             # --target fireworks\n├── langchain.py             # --target langchain\n├── llama_index.py           # --target llama-index\n├── haystack.py              # --target haystack\n├── chroma.py                # --target chroma\n├── faiss_helpers.py         # --target faiss\n├── qdrant.py                # --target qdrant\n├── weaviate.py              # --target weaviate\n├── pinecone_adaptor.py      # --target pinecone\n└── streaming_adaptor.py     # --target streaming\n```\n\nAll adaptors use `--target`. All adaptors are imported with `try/except ImportError` so missing optional deps don't break the registry.\n\n### 18 Source Type Converters\n\nEach in `src/skill_seekers/cli/{type}_scraper.py` as a `SkillConverter` subclass (no `main()`). The `create_command.py` uses `source_detector.py` to auto-detect, then calls `get_converter()`. Converters: web (doc_scraper), github, pdf, word, epub, video, local (codebase_scraper), jupyter, html, openapi, asciidoc, pptx, rss, manpage, confluence, notion, chat, config (unified_scraper).\n\n### CLI Argument System (single-definition parsers)\n\n```\nsrc/skill_seekers/cli/\n├── parsers/              # Central SubcommandParser classes — the ONLY definition of each command's flags\n│   └── create_parser.py  # Progressive help disclosure (--help-web, --help-github, etc.)\n├── arguments/            # Argument definitions\n│   ├── common.py         # add_all_standard_arguments() - shared across all scrapers\n│   └── create.py         # UNIVERSAL_ARGUMENTS, WEB_ARGUMENTS, GITHUB_ARGUMENTS, etc.\n├── exit_codes.py         # EXIT_SUCCESS/ERROR/VALIDATION/INTERRUPT\n└── source_detector.py    # Auto-detect source type from input string\n```\n\nCommand modules' standalone `main(args=None)` paths build their parser FROM the central `SubcommandParser` class — **add/change a flag in `parsers/*.py` only**. Drift guards (`tests/test_cli_parsers.py::TestCentralModuleParserSync` and `TestCentralParserSingleSource`) fail CI on any divergence of dests/defaults/option strings.\n\n`ExecutionContext.override()` is context-local (a `ContextVar` layered over the unchanged base singleton) — thread/async safe for the MCP server; propagate to worker threads via `copy_context`.\n\n### Standalone subsystems (outside `cli/`)\n\nFour top-level packages sit beside `cli/` and are largely independent of the scrape→build→package flow:\n\n- `embedding/` — FastAPI embedding-generation server (`python -m skill_seekers.embedding.server`) with a caching layer (`cache.py`) and multi-backend generators (OpenAI, sentence-transformers, Anthropic). Feeds the vector-DB adaptors.\n- `sync/` — real-time doc-sync system: `detector.py` (content-hash / last-modified change detection), `monitor.py` (scheduled incremental re-scrapes), `notifier.py` (email/Slack/webhook). Keeps generated skills fresh as upstream docs change.\n- `benchmark/` — performance suite (`runner.py`, `framework.py`) measuring scrape/embedding/storage/e2e timing, memory, and CPU; emits comparison + optimization reports.\n- `workflows/` — bundled default enhancement-workflow presets consumed by the enhancement step.\n\n### C3.x Codebase Analysis Pipeline\n\nLocal codebase analysis features, all opt-out (`--skip-*` flags):\n- C3.1 `pattern_recognizer.py` - Design pattern detection (10 GoF patterns, 9 languages)\n- C3.2 `test_example_extractor.py` - Usage examples from tests\n- C3.3 `how_to_guide_builder.py` - AI-enhanced educational guides\n- C3.4 `config_extractor.py` - Configuration pattern extraction\n- C3.5 `generate_router.py` - Architecture overview generation\n- C3.10 `signal_flow_analyzer.py` - Godot signal flow analysis\n\n### MCP Server\n\n`src/skill_seekers/mcp/server_fastmcp.py` - 40 tools via FastMCP. Transport: stdio (Claude Code) or HTTP (Cursor/Windsurf). Optional dependency: `pip install -e \".[mcp]\"`\n\n- **Tools run in-process** via `run_cli_main()` in `mcp/tools/_common.py`: same argv parsed by the command's REAL parser (sys.argv patch under a lock), stdout/stderr capture + contextvar log capture, identical `(stdout, stderr, returncode)` contract. No subprocess startup; old hard timeouts are advisory.\n- **Exceptions BY DESIGN**: `enhance_skill` (LOCAL agent) and `install_skill`'s enhancement step stay subprocess — the agent must be a real child process for the fork-bomb-guard env semantics (`SKILL_SEEKER_ENHANCE_ACTIVE`). Never make these in-process.\n- **Domain logic lives in `skill_seekers.services/`** (marketplace_manager, marketplace_publisher, config_publisher, source_manager, git_repo) — importable by CLI without the `[mcp]` extra; old `skill_seekers.mcp.*` paths are back-compat shims. No `sys.path` hacks anywhere in `mcp/`.\n\n### Seeker HUD (web UI)\n\nFastAPI backend in `src/skill_seekers/web/`, React app in `ui/`; see `docs/guides/WEB_UI.md`.\n\n- HUD routes live in `src/skill_seekers/web/routes/` (one module per screen, `register(app, ctx)`); `app.py` keeps the original routes.\n\n### Enhancement (AgentClient is the single AI transport)\n\nEvery AI call goes through `AgentClient` (`src/skill_seekers/cli/agent_client.py`): central truncation gate, timeout policy, error classification. `API_PROVIDERS` (provider registry) and `AGENT_PRESETS` (local-agent command templates) live ONLY there. Each `API_PROVIDERS` entry declares its wire `protocol` (`anthropic`/`openai`/`google`) and `supports_images` capability — `_call_api` branches on the resolved protocol, NOT the provider name, so an OpenAI/Anthropic-compatible provider needs no new branch. Adaptors declare provider/endpoint/model/prompt and route through `SkillAdaptor._enhance_skill_md_via_client` (atomic save with backup). Multimodal image input goes through `AgentClient.call_with_image()` (used by `video_visual` frame OCR across all image-capable providers); it no longer bypasses AgentClient with a direct SDK call.\n\n- **API mode** (if API key set): Anthropic, Google Gemini, OpenAI, Moonshot/Kimi, MiniMax — detected in registry order; `SKILL_SEEKER_PROVIDER` forces one. Models: `SKILL_SEEKER_MODEL` (global) or `ANTHROPIC_MODEL`/`GOOGLE_MODEL`/`OPENAI_MODEL`/`MOONSHOT_MODEL`/`MINIMAX_MODEL`; `ANTHROPIC_BASE_URL` for compatible endpoints. MiniMax adds `MINIMAX_API_REGION` (`global_en`/`cn_zh`), `MINIMAX_API_PROTOCOL` (`openai`/`anthropic`) and `MINIMAX_THINKING` (`adaptive`/`disabled`, OpenAI protocol only; validated at `AgentClient` construction). Video input (`AgentClient.call_with_video()`, MiniMax-M3 only, 50 MB cap) is registry-driven like images: `supports_video`, `video_models`, `video_max_bytes`, `thinking_modes`, `thinking_env` on the provider entry. Vision OCR provider: `SKILL_SEEKER_VISION_PROVIDER` (`auto` picks the first image-capable provider with a key).\n- **LOCAL mode** (fallback): Claude Code, Kimi Code, Codex, Copilot, OpenCode, custom agents — command built by `build_local_agent_command()`.\n- Control: `--enhance-level 0` (off) / `1` (SKILL.md only) / `2` (default, balanced) / `3` (full)\n- Agent selection: `--agent claude|codex|copilot|opencode|kimi|custom`\n\n## Key Implementation Details\n\n### Smart Categorization (`doc_scraper.py:smart_categorize()`)\n\nScores pages against category keywords: 3 points for URL match, 2 for title, 1 for content. Threshold of 2+ required. Falls back to \"other\".\n\n### Content Extraction (`doc_scraper.py`)\n\n`FALLBACK_MAIN_SELECTORS` constant + `_find_main_content()` helper handle CSS selector fallback. Links are extracted from the full page before early return (not just main content). `body` is deliberately excluded from fallbacks.\n\n### Three-Stream GitHub Architecture (`unified_codebase_analyzer.py`)\n\nStream 1: Code Analysis (AST, patterns, tests, guides). Stream 2: Documentation (README, docs/, wiki). Stream 3: Community (issues, PRs, metadata). Depth control: `basic` (1-2 min) or `c3x` (20-60 min).\n\n## Testing\n\n### Test markers (pytest.ini)\n\n```bash\npytest tests/ -v                                    # Default: fast tests only\npytest tests/ -v -m slow                            # Include slow tests (>5s)\npytest tests/ -v -m integration                     # External services required\npytest tests/ -v -m e2e                             # Resource-intensive\npytest tests/ -v -m \"not slow and not integration\"  # Fastest subset\n```\n\n### Known legitimate skips (~11)\n\n- 2: chromadb incompatible with Python 3.14 (pydantic v1)\n- 2: weaviate-client not installed\n- 2: Qdrant not running (requires docker)\n- 2: langchain/llama_index not installed\n- 3: GITHUB_TOKEN not set\n\n### sys.modules gotcha\n\n`test_swift_detection.py` deletes `skill_seekers.cli` modules from `sys.modules`. It must save and restore both `sys.modules` entries AND parent package attributes (`setattr`). See the test file for the pattern.\n\n## Dependencies\n\nCore deps include `langchain`, `llama-index`, `anthropic`, `httpx`, `PyMuPDF`, `pydantic`. Platform-specific deps are optional:\n\n```bash\npip install -e \".[mcp]\"       # MCP server\npip install -e \".[gemini]\"    # Google Gemini\npip install -e \".[openai]\"    # OpenAI\npip install -e \".[docx]\"      # Word documents\npip install -e \".[epub]\"      # EPUB books\npip install -e \".[video]\"     # Video (lightweight)\npip install -e \".[video-full]\"# Video (Whisper + visual)\npip install -e \".[jupyter]\"   # Jupyter notebooks\npip install -e \".[pptx]\"      # PowerPoint\npip install -e \".[rss]\"       # RSS/Atom feeds\npip install -e \".[confluence]\"# Confluence wiki\npip install -e \".[notion]\"    # Notion pages\npip install -e \".[chroma]\"    # ChromaDB\npip install -e \".[all]\"       # Everything (except video-full)\n```\n\nDev dependencies use PEP 735 `[dependency-groups]` in pyproject.toml.\n\n## Environment Variables\n\n```bash\nANTHROPIC_API_KEY=sk-ant-...          # Claude AI (or compatible endpoint)\nANTHROPIC_BASE_URL=https://...        # Optional: Claude-compatible API endpoint\nGOOGLE_API_KEY=AIza...                # Google Gemini (optional)\nOPENAI_API_KEY=sk-...                 # OpenAI (optional)\nGITHUB_TOKEN=ghp_...                  # Higher GitHub rate limits\n```\n\n## Adding New Features\n\n### New platform adaptor\n1. Create `src/skill_seekers/cli/adaptors/{platform}.py` inheriting `SkillAdaptor` from `base.py`\n2. Register in `adaptors/__init__.py` (add try/except import + add to `ADAPTORS` dict)\n3. Add optional dep to `pyproject.toml`\n4. Add tests in `tests/`\n\n### New source type converter\n1. Create `src/skill_seekers/cli/{type}_scraper.py` — for document-shaped sources inherit `DocumentSkillBuilder` (categorization/references/index/SKILL.md come free; implement `extract()` + hooks), otherwise inherit `SkillConverter` and implement `extract()` and `build_skill()`. Set `SOURCE_TYPE`.\n2. Register in `CONVERTER_REGISTRY` in `skill_converter.py` — this also makes the type work in unified configs automatically (UnifiedScraper engine)\n3. Add source type config building in `create_command.py:_build_config()`\n4. Add auto-detection in `source_detector.py`\n5. Add optional dep if needed\n6. Add tests\n\n### New CLI argument\n- Subcommand flag: define ONLY in the central parser class (`parsers/{cmd}_parser.py`) — module `main()` builds from it; the drift-guard test fails otherwise\n- Universal: `UNIVERSAL_ARGUMENTS` in `arguments/create.py`\n- Source-specific: appropriate dict (`WEB_ARGUMENTS`, `GITHUB_ARGUMENTS`, etc.)\n- Shared across scrapers: `add_all_standard_arguments()` in `arguments/common.py`\n","isInternal":false,"tokens":5550,"sizeBytes":22164},{"name":"SKILL.md","path":"distribution/claude-plugin/skills/skill-builder/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/distribution/claude-plugin/skills/skill-builder/SKILL.md","title":"skill-builder","category":"anthropic-skill","format":"markdown","content":"---\nname: skill-builder\ndescription: Automatically detect source types and build AI skills using Skill Seekers. Use when the user wants to create skills from documentation, repos, PDFs, videos, or other knowledge sources.\n---\n\n# Skill Builder\n\nThis skill uses the Skill Seekers MCP server, which provides 40 tools for converting knowledge sources into AI-ready skills. If the MCP tools are not available, use the CLI fallback at the bottom of this file instead — do not stop.\n\n## Prerequisites\n\nThe MCP tools below only work when the Skill Seekers MCP server is connected:\n\n1. Install the package: `pip install \"skill-seekers[mcp]\"`\n2. Connect the server:\n   - Installed as the Skill Seekers plugin? Nothing to do — the plugin's bundled `.mcp.json` starts the server automatically (it still needs step 1).\n   - Installed standalone (e.g. copied into `~/.claude/skills/`)? Register the server once: `claude mcp add skill-seekers -- python -m skill_seekers.mcp.server_fastmcp`\n\nIf tools like `scrape_docs` or `package_skill` are not in your tool list, the server is not connected. Tell the user about the two steps above, and use the CLI fallback in the meantime.\n\n## When to Use This Skill\n\nUse this skill when the user:\n- Wants to create an AI skill from a documentation site, GitHub repo, PDF, video, or other source\n- Needs to convert documentation into a format suitable for LLM consumption\n- Wants to update or sync existing skills with their source documentation\n- Needs to export skills to vector databases (Weaviate, Chroma, FAISS, Qdrant)\n- Asks about scraping, converting, or packaging documentation for AI\n\n## Source Type Detection\n\nAutomatically detect the source type from user input:\n\n| Input Pattern | Source Type | Tool to Use |\n|---------------|-------------|-------------|\n| `https://...` (not GitHub/YouTube) | Documentation | `scrape_docs` |\n| `owner/repo` or `github.com/...` | GitHub | `scrape_github` |\n| `*.pdf` | PDF | `scrape_pdf` |\n| YouTube/Vimeo URL or video file | Video | `scrape_video` |\n| Local directory path | Codebase | `scrape_codebase` |\n| `*.ipynb`, `*.html`, `*.yaml` (OpenAPI), `*.adoc`, `*.pptx`, `*.rss`, `*.1`-`.8` | Various | `scrape_generic` |\n| JSON config file | Unified | Use config with `scrape_docs` |\n\n## Recommended Workflow\n\n1. **Detect source type** from the user's input\n2. **Generate or fetch config** using `generate_config` or `fetch_config` if needed\n3. **Estimate scope** with `estimate_pages` for documentation sites\n4. **Scrape the source** using the appropriate scraping tool\n5. **Enhance** with `enhance_skill` if the user wants AI-powered improvements\n6. **Package** with `package_skill` for the target platform\n7. **Export to vector DB** if requested using `export_to_*` tools\n\n## Available MCP Tools\n\n### Config Management\n- `generate_config` — Generate a scraping config from a URL\n- `list_configs` — List available preset configs\n- `validate_config` — Validate a config file\n\n### Scraping (use based on source type)\n- `scrape_docs` — Documentation sites\n- `scrape_github` — GitHub repositories\n- `scrape_pdf` — PDF files\n- `scrape_video` — Video transcripts\n- `scrape_codebase` — Local code analysis\n- `scrape_generic` — Jupyter, HTML, OpenAPI, AsciiDoc, PPTX, RSS, manpage, Confluence, Notion, chat\n\n### Post-processing\n- `enhance_skill` — AI-powered skill enhancement\n- `package_skill` — Package for target platform\n- `upload_skill` — Upload to platform API\n- `install_skill` — End-to-end install workflow\n\n### Advanced\n- `detect_patterns` — Design pattern detection in code\n- `extract_test_examples` — Extract usage examples from tests\n- `build_how_to_guides` — Generate how-to guides from tests\n- `split_config` — Split large configs into focused skills\n- `export_to_weaviate`, `export_to_chroma`, `export_to_faiss`, `export_to_qdrant` — Vector DB export\n\n## CLI Fallback (MCP server not connected)\n\nThe same pipeline is available from the command line (requires `pip install skill-seekers`). Run it with the Bash tool:\n\n```bash\nskill-seekers create <source>                      # auto-detects: URL, owner/repo, ./path, file.pdf, video URL, ...\nskill-seekers package <skill_dir> --target claude  # or gemini/openai/langchain/chroma/...\n```\n\n`create` covers detection, scraping, and building in one step; add `--enhance-level 0` to skip AI enhancement. After it finishes, read the generated `SKILL.md` and summarize what was created.\n","frontmatter":{"name":"skill-builder","description":"Automatically detect source types and build AI skills using Skill Seekers. Use when the user wants to create skills from documentation, repos, PDFs, videos, or other knowledge sources."},"isInternal":false,"tokens":1109,"sizeBytes":4447},{"name":"SKILL.md","path":"skills/skill-seekers/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/skills/skill-seekers/SKILL.md","title":"skill-builder","category":"anthropic-skill","format":"markdown","content":"---\nname: skill-builder\ndescription: Automatically detect source types and build AI skills using Skill Seekers. Use when the user wants to create skills from documentation, repos, PDFs, videos, or other knowledge sources.\n---\n\n# Skill Builder\n\nYou have access to the Skill Seekers MCP server which provides 40 tools for converting knowledge sources into AI-ready skills.\n\n## When to Use This Skill\n\nUse this skill when the user:\n- Wants to create an AI skill from a documentation site, GitHub repo, PDF, video, or other source\n- Needs to convert documentation into a format suitable for LLM consumption\n- Wants to update or sync existing skills with their source documentation\n- Needs to export skills to vector databases (Weaviate, Chroma, FAISS, Qdrant)\n- Asks about scraping, converting, or packaging documentation for AI\n\n## Source Type Detection\n\nAutomatically detect the source type from user input:\n\n| Input Pattern | Source Type | Tool to Use |\n|---------------|-------------|-------------|\n| `https://...` (not GitHub/YouTube) | Documentation | `scrape_docs` |\n| `owner/repo` or `github.com/...` | GitHub | `scrape_github` |\n| `*.pdf` | PDF | `scrape_pdf` |\n| YouTube/Vimeo URL or video file | Video | `scrape_video` |\n| Local directory path | Codebase | `scrape_codebase` |\n| `*.ipynb`, `*.html`, `*.yaml` (OpenAPI), `*.adoc`, `*.pptx`, `*.rss`, `*.1`-`.8` | Various | `scrape_generic` |\n| JSON config file | Unified | Use config with `scrape_docs` |\n\n## Recommended Workflow\n\n1. **Detect source type** from the user's input\n2. **Generate or fetch config** using `generate_config` or `fetch_config` if needed\n3. **Estimate scope** with `estimate_pages` for documentation sites\n4. **Scrape the source** using the appropriate scraping tool\n5. **Enhance** with `enhance_skill` if the user wants AI-powered improvements\n6. **Package** with `package_skill` for the target platform\n7. **Export to vector DB** if requested using `export_to_*` tools\n\n## Available MCP Tools\n\n### Config Management\n- `generate_config` — Generate a scraping config from a URL\n- `list_configs` — List available preset configs\n- `validate_config` — Validate a config file\n\n### Scraping (use based on source type)\n- `scrape_docs` — Documentation sites\n- `scrape_github` — GitHub repositories\n- `scrape_pdf` — PDF files\n- `scrape_video` — Video transcripts\n- `scrape_codebase` — Local code analysis\n- `scrape_generic` — Jupyter, HTML, OpenAPI, AsciiDoc, PPTX, RSS, manpage, Confluence, Notion, chat\n\n### Post-processing\n- `enhance_skill` — AI-powered skill enhancement\n- `package_skill` — Package for target platform\n- `upload_skill` — Upload to platform API\n- `install_skill` — End-to-end install workflow\n\n### Advanced\n- `detect_patterns` — Design pattern detection in code\n- `extract_test_examples` — Extract usage examples from tests\n- `build_how_to_guides` — Generate how-to guides from tests\n- `split_config` — Split large configs into focused skills\n- `export_to_weaviate`, `export_to_chroma`, `export_to_faiss`, `export_to_qdrant` — Vector DB export\n","frontmatter":{"name":"skill-builder","description":"Automatically detect source types and build AI skills using Skill Seekers. Use when the user wants to create skills from documentation, repos, PDFs, videos, or other knowledge sources."},"isInternal":false,"tokens":768,"sizeBytes":3073},{"name":"SKILL.md","path":"tests/golden/phase2/chat_empty/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/chat_empty/SKILL.md","title":"golden-chat-empty","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-chat-empty\ndescription: Use when testing the golden_chat_empty golden build\n---\n\n# Golden_Chat_Empty Slack Chat Skill\n\nUse when testing the golden_chat_empty golden build\n\n## 📋 Slack Chat Information\n\n**Platform:** Slack\n\n**Source:** fixtures/empty-export/\n\n**Total Messages:** 0\n\n**Unique Users:** 0\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat_empty chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 0\n\n**Content Breakdown:**\n\n- **Chat Content**: 0 sections\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 0\n- **Total Threads**: 0\n- **Code Snippets**: 0\n- **Shared Links**: 0\n- **Unique Users**: 0\n- **Channels**: 0\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_01.md` - Chat Content\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Slack Chat Scraper\n","frontmatter":{"name":"golden-chat-empty","description":"Use when testing the golden_chat_empty golden build"},"isInternal":false,"tokens":273,"sizeBytes":1125},{"name":"SKILL.md","path":"tests/golden/phase2/chat_single/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/chat_single/SKILL.md","title":"golden-chat-single","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-chat-single\ndescription: Use when testing the golden_chat_single golden build\n---\n\n# Golden_Chat_Single Slack Chat Skill\n\nUse when testing the golden_chat_single golden build\n\n## 📋 Slack Chat Information\n\n**Platform:** Slack\n\n**Source:** fixtures/slack-export/\n\n**Total Messages:** 1\n\n**Unique Users:** 1\n\n**Channels:** #general\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat_single chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 1\n\n**Content Breakdown:**\n\n- **General Discussion**: 1 sections\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 1\n- **Total Threads**: 0\n- **Code Snippets**: 0\n- **Shared Links**: 0\n- **Unique Users**: 1\n- **Channels**: 1\n\n**Channel Activity:**\n\n- #general: 1 messages, 1 users\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/main.md` - General Discussion\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Slack Chat Scraper\n","frontmatter":{"name":"golden-chat-single","description":"Use when testing the golden_chat_single golden build"},"isInternal":false,"tokens":293,"sizeBytes":1216},{"name":"SKILL.md","path":"tests/golden/phase2/chat_topics/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/chat_topics/SKILL.md","title":"golden-chat-topics","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-chat-topics\ndescription: Use when testing the golden_chat_topics golden build\n---\n\n# Golden_Chat_Topics Discord Chat Skill\n\nUse when testing the golden_chat_topics golden build\n\n## 📋 Discord Chat Information\n\n**Platform:** Discord\n\n**Source:** fixtures/discord-export.json\n\n**Total Messages:** 3\n\n**Unique Users:** 2\n\n**Channels:** #help\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat_topics chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Troubleshooting**: 1 sections\n- **General Discussion**: 1 sections\n\n## 🔑 Key Discussion Topics\n\n*Topics frequently discussed in chat*\n\n- **Troubleshooting**: 1 conversations\n- **Setup**: 1 conversations\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 3\n- **Total Threads**: 0\n- **Code Snippets**: 0\n- **Shared Links**: 0\n- **Unique Users**: 2\n- **Channels**: 1\n\n**Channel Activity:**\n\n- #help: 3 messages, 2 users\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/setup_s2-s2.md` - Setup\n- `references/troubleshooting_s1-s1.md` - Troubleshooting\n- `references/general_s3-s3.md` - General Discussion\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Discord Chat Scraper\n","frontmatter":{"name":"golden-chat-topics","description":"Use when testing the golden_chat_topics golden build"},"isInternal":false,"tokens":379,"sizeBytes":1526},{"name":"SKILL.md","path":"tests/golden/phase2/chat/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/chat/SKILL.md","title":"golden-chat","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-chat\ndescription: Use when testing the golden_chat golden build\n---\n\n# Golden_Chat Slack Chat Skill\n\nUse when testing the golden_chat golden build\n\n## 📋 Slack Chat Information\n\n**Platform:** Slack\n\n**Source:** fixtures/slack-export/\n\n**Total Messages:** 6\n\n**Unique Users:** 3\n\n**Channels:** #engineering, #random\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **#engineering**: 2 sections\n- **#random**: 1 sections\n\n## 🔑 Key Discussion Topics\n\n*Topics frequently discussed in chat*\n\n- **Troubleshooting**: 1 conversations\n- **Setup**: 1 conversations\n\n## 📝 Top Code Snippets\n\n*High-quality code shared in chat*\n\n### Python (2 snippets)\n\n**Snippet 1** (by bob) (Quality: 9.5/10):\n\n```python\ndef long_helper():\n    y0 = 0\n    y1 = 1\n    y2 = 2\n    y3 = 3\n    y4 = 4\n    y5 = 5\n    y6 = 6\n    y7 = 7\n    y8 = 8\n    y9 = 9\n    y10 = 10\n    y11 = 11\n    y12 = 12\n    y13 = 13\n    y14 = 14\n    y15 = 15\n    y16 = 16\n    y17 = 17\n    y18 = 18\n    y19 = 19\n    y20 = 20\n    y21 = 21\n    y22 = 22\n    y23 = 23\n    y24 = 24\n    y25 = 25\n    y26 = 26\n    y27 = 27\n    y28 = 28\n    y29 = 29\n    y30 = 30\n    y31 = 31\n    y32 = 32\n    y33 = 33\n    y34 = 34\n    y35 = 35\n    y36 = 36\n    y37 = 37\n    y38\n...\n```\n\n**Snippet 2** (by bob) (Quality: 7.0/10):\n\n```python\nprint('patched')\n```\n\n### Unknown (1 snippets)\n\n**Snippet 1** (by alice) (Quality: 4.0/10):\n\n```unknown\nkubectl get pods\n```\n\n## 🔗 Shared Links (21)\n\n*Key resources shared in chat*\n\n- https://example.com/resource/0 (by alice, in #engineering)\n- https://example.com/resource/1 (by carol, in #random)\n- https://example.com/resource/2 (by alice, in #engineering)\n- https://example.com/resource/3 (by carol, in #random)\n- https://example.com/resource/4 (by alice, in #engineering)\n- https://example.com/resource/5 (by carol, in #random)\n- https://example.com/resource/6 (by alice, in #engineering)\n- https://example.com/resource/7 (by carol, in #random)\n- https://example.com/resource/8 (by alice, in #engineering)\n- https://example.com/resource/9 (by carol, in #random)\n- https://example.com/resource/10 (by alice, in #engineering)\n- https://example.com/resource/11 (by carol, in #random)\n- https://example.com/resource/12 (by alice, in #engineering)\n- https://example.com/resource/13 (by carol, in #random)\n- https://example.com/resource/14 (by alice, in #engineering)\n- https://example.com/resource/15 (by carol, in #random)\n- https://example.com/resource/16 (by alice, in #engineering)\n- https://example.com/resource/17 (by carol, in #random)\n- https://example.com/resource/18 (by alice, in #engineering)\n- https://example.com/resource/19 (by carol, in #random)\n\n*... and 1 more links*\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 6\n- **Total Threads**: 1\n- **Code Snippets**: 3\n- **Shared Links**: 21\n- **Unique Users**: 3\n- **Channels**: 2\n\n**Channel Activity:**\n\n- #engineering: 5 messages, 2 users\n- #random: 1 messages, 1 users\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/engineering_s1-s2.md` - #engineering\n- `references/random_s3-s3.md` - #random\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Slack Chat Scraper\n","frontmatter":{"name":"golden-chat","description":"Use when testing the golden_chat golden build"},"isInternal":false,"tokens":1100,"sizeBytes":3531},{"name":"SKILL.md","path":"tests/golden/phase2/epub_kw/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/epub_kw/SKILL.md","title":"golden-epub-kw","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-epub-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Epub_Kw Documentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_epub_kw concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Api**: 1 sections\n- **Other**: 1 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 1\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s2-s2.md` - Api\n- `references/section_s3-s3.md` - Other\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | EPUB Scraper\n","frontmatter":{"name":"golden-epub-kw","description":"Use when testing keyword categorization"},"isInternal":false,"tokens":821,"sizeBytes":2567},{"name":"SKILL.md","path":"tests/golden/phase2/epub/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/epub/SKILL.md","title":"golden-epub","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-epub\ndescription: Use when testing the epub golden build\n---\n\n# Golden_Epub Documentation Skill\n\nUse when testing the epub golden build\n\n## 📋 Document Information\n\n**Title:** The Handbook\n\n**Author:** Jane Doe\n\n**Language:** en\n\n**Publisher:** Acme Press\n\n**Date:** 2024-01-01\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_epub concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **handbook**: 3 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 1\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/handbook.md` - handbook\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | EPUB Scraper\n","frontmatter":{"name":"golden-epub","description":"Use when testing the epub golden build"},"isInternal":false,"tokens":814,"sizeBytes":2577},{"name":"SKILL.md","path":"tests/golden/phase2/html_kw/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/html_kw/SKILL.md","title":"golden-html-kw","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-html-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Html_Kw Documentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_html_kw concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 4\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Api**: 1 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n- Changelog\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Changelog** (1 sections):\n- Changelog (section 4)\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 4\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **HTML Files**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s2-s2.md` - Api\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | HTML Scraper\n","frontmatter":{"name":"golden-html-kw","description":"Use when testing keyword categorization"},"isInternal":false,"tokens":845,"sizeBytes":2652},{"name":"SKILL.md","path":"tests/golden/phase2/html_multi/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/html_multi/SKILL.md","title":"golden-html-multi","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-html-multi\ndescription: Use when testing the multi-file html build\n---\n\n# Golden_Html_Multi Documentation Skill\n\nUse when testing the multi-file html build\n\n## 📋 Document Information\n\n**Title:** The Web Handbook\n\n**Source files:** 2 HTML files\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_html_multi concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 4\n\n**Content Breakdown:**\n\n- **intro**: 2 sections\n- **extras**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n- Changelog\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Changelog** (1 sections):\n- Changelog (section 4)\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 4\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **HTML Files**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/golden_html_multi_s1-s2.md` - intro\n- `references/golden_html_multi_s3-s4.md` - extras\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | HTML Scraper\n","frontmatter":{"name":"golden-html-multi","description":"Use when testing the multi-file html build"},"isInternal":false,"tokens":855,"sizeBytes":2720},{"name":"SKILL.md","path":"tests/golden/phase2/html/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/html/SKILL.md","title":"golden-html","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-html\ndescription: Use when testing the html golden build\n---\n\n# Golden_Html Documentation Skill\n\nUse when testing the html golden build\n\n## 📋 Document Information\n\n**Title:** The Web Handbook\n\n**Author:** Jane Doe\n\n**Language:** en\n\n**Description:** A handbook about the web.\n\n**Keywords:** web, html, docs\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_html concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 4\n\n**Content Breakdown:**\n\n- **page**: 4 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n- Changelog\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Changelog** (1 sections):\n- Changelog (section 4)\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 4\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **HTML Files**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/page.md` - page\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | HTML Scraper\n","frontmatter":{"name":"golden-html","description":"Use when testing the html golden build"},"isInternal":false,"tokens":836,"sizeBytes":2680},{"name":"SKILL.md","path":"tests/golden/phase2/jupyter_dir/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/jupyter_dir/SKILL.md","title":"golden-jupyter-dir","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-jupyter-dir\ndescription: Use when testing the golden_jupyter_dir golden build\n---\n\n# Golden_Jupyter_Dir Notebook Skill\n\nUse when testing the golden_jupyter_dir golden build\n\n## 📋 Notebook Information\n\n**Kernel:** Python 3\n\n**Language:** python 3.11.4\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter_dir concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **Data Loading**: 1 sections\n- **Evaluation**: 1 sections\n- **Setup**: 1 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s2-s2.md` - Data Loading\n- `references/section_s5-s5.md` - Evaluation\n- `references/section_s1-s1.md` - Setup\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n","frontmatter":{"name":"golden-jupyter-dir","description":"Use when testing the golden_jupyter_dir golden build"},"isInternal":false,"tokens":869,"sizeBytes":2658},{"name":"SKILL.md","path":"tests/golden/phase2/jupyter_kw/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/jupyter_kw/SKILL.md","title":"golden-jupyter-kw","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-jupyter-kw\ndescription: Use when testing the golden_jupyter_kw golden build\n---\n\n# Golden_Jupyter_Kw Notebook Skill\n\nUse when testing the golden_jupyter_kw golden build\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter_kw concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Modeling**: 1 sections\n- **Loading**: 1 sections\n- **Empty Cat**: 0 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s5-s5.md` - Modeling\n- `references/section_s2-s2.md` - Loading\n- `references/section_04.md` - Empty Cat\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n","frontmatter":{"name":"golden-jupyter-kw","description":"Use when testing the golden_jupyter_kw golden build"},"isInternal":false,"tokens":866,"sizeBytes":2627},{"name":"SKILL.md","path":"tests/golden/phase2/jupyter_topics/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/jupyter_topics/SKILL.md","title":"golden-jupyter-topics","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-jupyter-topics\ndescription: Use when testing the golden_jupyter_topics golden build\n---\n\n# Golden_Jupyter_Topics Notebook Skill\n\nUse when testing the golden_jupyter_topics golden build\n\n## 📋 Notebook Information\n\n**Kernel:** Python 3\n\n**Language:** python 3.11.4\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter_topics concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **Data Loading**: 1 sections\n- **Evaluation**: 1 sections\n- **Setup**: 1 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s2-s2.md` - Data Loading\n- `references/section_s5-s5.md` - Evaluation\n- `references/section_s1-s1.md` - Setup\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n","frontmatter":{"name":"golden-jupyter-topics","description":"Use when testing the golden_jupyter_topics golden build"},"isInternal":false,"tokens":870,"sizeBytes":2673},{"name":"SKILL.md","path":"tests/golden/phase2/jupyter/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/jupyter/SKILL.md","title":"golden-jupyter","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-jupyter\ndescription: Use when testing the golden_jupyter golden build\n---\n\n# Golden_Jupyter Notebook Skill\n\nUse when testing the golden_jupyter golden build\n\n## 📋 Notebook Information\n\n**Kernel:** Python 3\n\n**Language:** python 3.11.4\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **analysis**: 5 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/analysis.md` - analysis\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n","frontmatter":{"name":"golden-jupyter","description":"Use when testing the golden_jupyter golden build"},"isInternal":false,"tokens":791,"sizeBytes":2423},{"name":"SKILL.md","path":"tests/golden/phase2/man_kw/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/man_kw/SKILL.md","title":"golden-man-kw","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-man-kw\ndescription: Use when testing the man golden build\n---\n\n# Golden_Man_Kw Man Pages Skill\n\nUse when testing the man golden build\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_man_kw command-line tools and their options\n- Look up command syntax and usage patterns\n- Find examples of common command invocations\n- Review available flags and environment variables\n- Explore related commands via SEE ALSO references\n\n## Quick Command Reference\n\n### git-log\n\n```\ngit log [<options>] [<revision-range>] [[--] <path>...]\n```\n\n### git-diff\n\n```\ngit diff [<options>] [<commit>] [--] [<path>...]\n```\n\n## Man Page Overview\n\n**Total Man Pages:** 3\n\n**Content Breakdown:**\n\n- **Version Control**: 2 man page(s)\n- **Other**: 1 man page(s)\n\n## Common Options\n\n*3 options extracted across all man pages*\n\n### git-log\n\n- `-p` -- Generate patch output.\n- `--max-count=<number>` -- Limit the number of commits to output, interacting subtly with pathspec filtering, history simplification, and the --fol...\n\n### curl\n\n- `-s, --silent` -- Silent mode.\n\n## Examples\n\n*3 example(s) extracted from man pages*\n\n### git-log\n\nShow the last three commits\n\n```bash\ngit log -3\n```\n\n### git-log\n\nProse-only example with no command\n\n### curl\n\nFetch a page\n\n```bash\ncurl https://example.com\n```\n\n## Related Commands (SEE ALSO)\n\n- `git-diff`\n- `git-log`\n- `gitk`\n\n## Documentation Statistics\n\n- **Total Man Pages**: 3\n- **Total Options**: 3\n- **Total Examples**: 3\n- **Cross-references**: 3\n\n## Navigation\n\n**Reference Files:**\n\n- `references/version_control_01.md` -- Version Control\n- `references/other_02.md` -- Other\n\nSee `references/index.md` for complete reference structure.\n\n---\n\n**Generated by Skill Seekers** | Man Page Scraper\n","frontmatter":{"name":"golden-man-kw","description":"Use when testing the man golden build"},"isInternal":false,"tokens":447,"sizeBytes":1760},{"name":"SKILL.md","path":"tests/golden/phase2/man_single/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/man_single/SKILL.md","title":"golden-man-single","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-man-single\ndescription: Use when testing the man golden build\n---\n\n# Golden_Man_Single Man Pages Skill\n\nUse when testing the man golden build\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_man_single command-line tools and their options\n- Look up command syntax and usage patterns\n- Find examples of common command invocations\n- Review available flags and environment variables\n- Explore related commands via SEE ALSO references\n\n## Man Page Overview\n\n**Total Man Pages:** 1\n\n**Content Breakdown:**\n\n- **curl**: 1 man page(s)\n\n## Common Options\n\n*1 options extracted across all man pages*\n\n### curl\n\n- `-s, --silent` -- Silent mode.\n\n## Examples\n\n*1 example(s) extracted from man pages*\n\n### curl\n\nFetch a page\n\n```bash\ncurl https://example.com\n```\n\n## Documentation Statistics\n\n- **Total Man Pages**: 1\n- **Total Options**: 1\n- **Total Examples**: 1\n- **Cross-references**: 0\n\n## Navigation\n\n**Reference Files:**\n\n- `references/curl.md` -- curl\n\nSee `references/index.md` for complete reference structure.\n\n---\n\n**Generated by Skill Seekers** | Man Page Scraper\n","frontmatter":{"name":"golden-man-single","description":"Use when testing the man golden build"},"isInternal":false,"tokens":265,"sizeBytes":1114},{"name":"SKILL.md","path":"tests/golden/phase2/man/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/man/SKILL.md","title":"golden-man","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-man\ndescription: Use when testing the man golden build\n---\n\n# Golden_Man Man Pages Skill\n\nUse when testing the man golden build\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_man command-line tools and their options\n- Look up command syntax and usage patterns\n- Find examples of common command invocations\n- Review available flags and environment variables\n- Explore related commands via SEE ALSO references\n\n## Quick Command Reference\n\n### git-log\n\n```\ngit log [<options>] [<revision-range>] [[--] <path>...]\n```\n\n### git-diff\n\n```\ngit diff [<options>] [<commit>] [--] [<path>...]\n```\n\n## Man Page Overview\n\n**Total Man Pages:** 3\n\n**Content Breakdown:**\n\n- **Git**: 2 man page(s)\n- **Curl**: 1 man page(s)\n\n## Common Options\n\n*3 options extracted across all man pages*\n\n### git-log\n\n- `-p` -- Generate patch output.\n- `--max-count=<number>` -- Limit the number of commits to output, interacting subtly with pathspec filtering, history simplification, and the --fol...\n\n### curl\n\n- `-s, --silent` -- Silent mode.\n\n## Examples\n\n*3 example(s) extracted from man pages*\n\n### git-log\n\nShow the last three commits\n\n```bash\ngit log -3\n```\n\n### git-log\n\nProse-only example with no command\n\n### curl\n\nFetch a page\n\n```bash\ncurl https://example.com\n```\n\n## Related Commands (SEE ALSO)\n\n- `git-diff`\n- `git-log`\n- `gitk`\n\n## Documentation Statistics\n\n- **Total Man Pages**: 3\n- **Total Options**: 3\n- **Total Examples**: 3\n- **Cross-references**: 3\n\n## Navigation\n\n**Reference Files:**\n\n- `references/git_01.md` -- Git\n- `references/curl_02.md` -- Curl\n\nSee `references/index.md` for complete reference structure.\n\n---\n\n**Generated by Skill Seekers** | Man Page Scraper\n","frontmatter":{"name":"golden-man","description":"Use when testing the man golden build"},"isInternal":false,"tokens":440,"sizeBytes":1712},{"name":"SKILL.md","path":"tests/golden/phase2/pdf_chapters/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/pdf_chapters/SKILL.md","title":"golden-pdf-ch","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-pdf-ch\ndescription: Use when testing chapter categorization\n---\n\n# Golden_Pdf_Ch Documentation Skill\n\nUse when testing chapter categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pdf_ch concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Chapter Overview\n\n**Total Pages:** 4\n\n**Content Breakdown:**\n\n- **Chapter 1: Basics**: 2 pages\n- **Chapter 2: Advanced**: 1 pages\n- **Additional Content**: 1 pages\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (page 1)\n\n**Installation** (1 sections):\n- Installation Steps (page 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (page 3)\n\n**Usage** (1 sections):\n- API Usage (page 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Documentation Statistics\n\n- **Total Pages**: 4\n- **Code Blocks**: 4\n- **Images/Diagrams**: 2\n- **Programming Languages**: 3\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n- text: 1 examples\n\n**Code Quality:**\n\n- Average Quality Score: 7.4/10\n- Valid Code Blocks: 4\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_p1-p2.md` - Chapter 1: Basics\n- `references/section_p3-p3.md` - Chapter 2: Advanced\n- `references/section_p4-p4.md` - Additional Content\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | PDF Documentation Scraper\n","frontmatter":{"name":"golden-pdf-ch","description":"Use when testing chapter categorization"},"isInternal":false,"tokens":817,"sizeBytes":2564},{"name":"SKILL.md","path":"tests/golden/phase2/pdf_kw/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/pdf_kw/SKILL.md","title":"golden-pdf-kw","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-pdf-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Pdf_Kw Documentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pdf_kw concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Chapter Overview\n\n**Total Pages:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 pages\n- **Api**: 1 pages\n- **Deployment**: 0 pages\n- **Other**: 1 pages\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (page 1)\n\n**Installation** (1 sections):\n- Installation Steps (page 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (page 3)\n\n**Usage** (1 sections):\n- API Usage (page 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Documentation Statistics\n\n- **Total Pages**: 3\n- **Code Blocks**: 4\n- **Images/Diagrams**: 2\n- **Programming Languages**: 3\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n- text: 1 examples\n\n**Code Quality:**\n\n- Average Quality Score: 7.4/10\n- Valid Code Blocks: 4\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_p1-p1.md` - Setup\n- `references/section_p2-p2.md` - Api\n- `references/section_03.md` - Deployment\n- `references/section_p3-p3.md` - Other\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | PDF Documentation Scraper\n","frontmatter":{"name":"golden-pdf-kw","description":"Use when testing keyword categorization"},"isInternal":false,"tokens":821,"sizeBytes":2550},{"name":"SKILL.md","path":"tests/golden/phase2/pdf/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/pdf/SKILL.md","title":"golden-pdf","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-pdf\ndescription: Use when testing the pdf golden build\n---\n\n# Golden_Pdf Documentation Skill\n\nUse when testing the pdf golden build\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pdf concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Chapter Overview\n\n**Total Pages:** 3\n\n**Content Breakdown:**\n\n- **manual**: 3 pages\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (page 1)\n\n**Installation** (1 sections):\n- Installation Steps (page 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (page 3)\n\n**Usage** (1 sections):\n- API Usage (page 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Documentation Statistics\n\n- **Total Pages**: 3\n- **Code Blocks**: 4\n- **Images/Diagrams**: 2\n- **Programming Languages**: 3\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n- text: 1 examples\n\n**Code Quality:**\n\n- Average Quality Score: 7.4/10\n- Valid Code Blocks: 4\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/manual.md` - manual\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | PDF Documentation Scraper\n","frontmatter":{"name":"golden-pdf","description":"Use when testing the pdf golden build"},"isInternal":false,"tokens":749,"sizeBytes":2346},{"name":"SKILL.md","path":"tests/golden/phase2/pptx_kw/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/pptx_kw/SKILL.md","title":"golden-pptx-kw","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-pptx-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Pptx_Kw Presentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pptx_kw concepts and fundamentals\n- Review presentation content and key points\n- Find code examples and implementation patterns\n- Access speaker notes and additional context\n- Reference tables and data from the presentation\n\n## 📖 Section Overview\n\n**Total Slides:** 8\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Api**: 1 sections\n- **Other**: 1 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this presentation*\n\n**Major Sections:**\n\n- Getting Started Guide\n- Architecture Overview\n- Summary and Q&A\n\n**Slide Topics:**\n\n- Slide 2: Verify Setup\n- Slide 3: First Demo\n- Slide 8: Common Errors\n\n## ⚡ Quick Reference\n\n*Common presentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Overview** (1 sections):\n- Architecture Overview (section 2)\n\n**Summary** (1 sections):\n- Summary and Q&A (section 3)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from presentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in presentation*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: Architecture Overview**\n\n## 📊 Presentation Statistics\n\n- **Total Slides**: 8\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s2-s2.md` - Api\n- `references/section_s3-s3.md` - Other\n\nSee `references/index.md` for complete presentation structure.\n\n---\n\n**Generated by Skill Seeker** | PowerPoint Presentation Scraper\n","frontmatter":{"name":"golden-pptx-kw","description":"Use when testing keyword categorization"},"isInternal":false,"tokens":855,"sizeBytes":2690},{"name":"SKILL.md","path":"tests/golden/phase2/pptx/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/pptx/SKILL.md","title":"golden-pptx","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-pptx\ndescription: Use when testing the pptx golden build\n---\n\n# Golden_Pptx Presentation Skill\n\nUse when testing the pptx golden build\n\n## 📋 Presentation Information\n\n**Title:** The Deck\n\n**Author:** Jane Doe\n\n**Subject:** Quarterly architecture review\n\n**Category:** Engineering\n\n**Created:** 2024-01-01\n\n**Modified:** 2024-03-03\n\n**Slides:** 8\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pptx concepts and fundamentals\n- Review presentation content and key points\n- Find code examples and implementation patterns\n- Access speaker notes and additional context\n- Reference tables and data from the presentation\n\n## 📖 Section Overview\n\n**Total Slides:** 8\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **deck**: 3 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this presentation*\n\n**Major Sections:**\n\n- Getting Started Guide\n- Summary and Q&A\n\n**Subsections:**\n\n- Installation Steps\n- Architecture Overview\n\n## ⚡ Quick Reference\n\n*Common presentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Overview** (1 sections):\n- Architecture Overview (section 2)\n\n**Summary** (1 sections):\n- Summary and Q&A (section 3)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from presentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in presentation*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: Architecture Overview**\n\n## 📊 Presentation Statistics\n\n- **Total Slides**: 8\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/deck.md` - deck\n\nSee `references/index.md` for complete presentation structure.\n\n---\n\n**Generated by Skill Seeker** | PowerPoint Presentation Scraper\n","frontmatter":{"name":"golden-pptx","description":"Use when testing the pptx golden build"},"isInternal":false,"tokens":845,"sizeBytes":2707},{"name":"SKILL.md","path":"tests/golden/phase2/rss_empty/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/rss_empty/SKILL.md","title":"golden-rss-empty","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-rss-empty\ndescription: Use when testing the empty rss golden build\n---\n\n# Quiet Feed Feed Skill\n\nUse when testing the empty rss golden build\n\n## 📡 Feed Information\n\n**Feed Title:** Quiet Feed\n\n**Feed Type:** Atom\n\n**Website:** https://example.com/quiet\n\n**Description:** A feed with no entries yet.\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Reference articles and content from Quiet Feed\n- Look up specific topics covered in the feed\n- Find author perspectives and expert analysis\n- Review recent posts and updates on the subject\n- Explore categorized content by tags or topics\n\n## 📖 Article Overview\n\n**Total Articles:** 0\n\n**Content by Category:**\n\n- **All Articles**: 0 articles\n\n## 📊 Feed Statistics\n\n- **Total Articles**: 0\n- **Feed Type**: Atom\n- **Categories/Tags**: 0\n- **Authors**: 0\n- **Full Content Scraped**: No\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/all_articles.md` - All Articles (0 articles)\n\nSee `references/index.md` for complete feed structure.\n\n---\n\n**Generated by Skill Seeker** | RSS/Atom Feed Scraper\n","frontmatter":{"name":"golden-rss-empty","description":"Use when testing the empty rss golden build"},"isInternal":false,"tokens":267,"sizeBytes":1097},{"name":"SKILL.md","path":"tests/golden/phase2/rss/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/rss/SKILL.md","title":"golden-rss","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-rss\ndescription: Use when testing the rss golden build\n---\n\n# Example Engineering Blog Feed Skill\n\nUse when testing the rss golden build\n\n## 📡 Feed Information\n\n**Feed Title:** Example Engineering Blog\n\n**Feed Type:** RSS 2.0\n\n**Website:** https://example.com\n\n**Language:** en-us\n\n**Description:** A feed description that is intentionally longer than the three hundred character limit applied in the Feed Information block of SKILL.md. A feed description that is intentionally longer than the three hundred character limit applied in the Feed Information block of SKILL.md. A feed description th...\n\n**Generator:** ExampleCMS 2.0\n\n**Rights:** © Example Inc.\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Reference articles and content from Example Engineering Blog\n- Look up specific topics covered in the feed\n- Find author perspectives and expert analysis\n- Review recent posts and updates on the subject\n- Explore categorized content by tags or topics\n\n## 📖 Article Overview\n\n**Total Articles:** 4\n\n**Content by Category:**\n\n- **Dev Ops**: 1 articles\n- **Python**: 1 articles\n- **uncategorized**: 1 articles\n- **★★★**: 1 articles\n\n## 📰 Recent Articles\n\n### Continuous Delivery in Practice\n\n**Published:** Mon, 01 Jan 2024 10:00:00 GMT | **Author:** Jane Doe\n\nThis is a deliberately long summary that keeps going well past the two hundred character truncation threshold used by the recent-articles block of SKILL.md so that the shortened form with a trailing e...\n\n[Read more](https://example.com/posts/cd-in-practice)\n\n### Typing Tips for Python\n\n**Published:** Fri, 15 Mar 2024 08:30:00 GMT | **Author:** John Roe\n\nShort notes on gradual typing.\n\n[Read more](https://example.com/posts/typing-tips)\n\n### An Uncategorized Note\n\n**Author:** Jane Doe\n\nA note without tags.\n\n### Symbols Only\n\n**Published:** Sat, 10 Feb 2024 12:00:00 GMT\n\n[Read more](https://example.com/posts/symbols)\n\n## ✍️ Authors (2)\n\n- **Jane Doe**: 2 articles\n- **John Roe**: 1 articles\n\n## 🏷️ Tags (55)\n\n`Dev Ops`, `Python`, `dev-ops`, `tag00`, `tag01`, `tag02`, `tag03`, `tag04`, `tag05`, `tag06`, `tag07`, `tag08`, `tag09`, `tag10`, `tag11`, `tag12`, `tag13`, `tag14`, `tag15`, `tag16`, `tag17`, `tag18`, `tag19`, `tag20`, `tag21`, `tag22`, `tag23`, `tag24`, `tag25`, `tag26`, `tag27`, `tag28`, `tag29`, `tag30`, `tag31`, `tag32`, `tag33`, `tag34`, `tag35`, `tag36`, `tag37`, `tag38`, `tag39`, `tag40`, `tag41`, `tag42`, `tag43`, `tag44`, `tag45`, `tag46` ... and 5 more\n\n## 📊 Feed Statistics\n\n- **Total Articles**: 4\n- **Feed Type**: RSS 2.0\n- **Categories/Tags**: 55\n- **Authors**: 2\n- **Full Content Scraped**: Yes\n\n- **Date Range**: 2024-01-01 to 2024-03-15\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/dev_ops.md` - Dev Ops (1 articles)\n- `references/python.md` - Python (1 articles)\n- `references/uncategorized.md` - uncategorized (1 articles)\n- `references/unnamed.md` - ★★★ (1 articles)\n\nSee `references/index.md` for complete feed structure.\n\n---\n\n**Generated by Skill Seeker** | RSS/Atom Feed Scraper\n","frontmatter":{"name":"golden-rss","description":"Use when testing the rss golden build"},"isInternal":false,"tokens":867,"sizeBytes":3075},{"name":"SKILL.md","path":"tests/golden/phase2/word/SKILL.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/tests/golden/phase2/word/SKILL.md","title":"golden-word","category":"anthropic-skill","format":"markdown","content":"---\nname: golden-word\ndescription: Use when testing the word golden build\n---\n\n# Golden_Word Documentation Skill\n\nUse when testing the word golden build\n\n## 📋 Document Information\n\n**Title:** The Manual\n\n**Author:** John Roe\n\n**Created:** 2023-05-05\n\n**Modified:** 2024-02-02\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_word concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **manual**: 3 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 1\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/manual.md` - manual\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | Word Document Scraper\n","frontmatter":{"name":"golden-word","description":"Use when testing the word golden build"},"isInternal":false,"tokens":806,"sizeBytes":2562},{"name":"2026-03-14-epub-input-support.md","path":"docs/agents/plans/2026-03-14-epub-input-support.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/docs/agents/plans/2026-03-14-epub-input-support.md","title":"Subagent: 2026-03-14-epub-input-support","category":"subagent-persona","format":"markdown","content":"---\ndate: 2026-03-14T19:30:35.172407+00:00\ngit_commit: 7c90a4b9c9bccac8341b0769550d77aae3b4e524\nbranch: development\ntopic: \"Add EPUB Input Support\"\ntags: [plan, epub, scraper, input-format]\nstatus: complete\n---\n\n> 🗄️ **Historical — completed** — This plan was fully executed. EPUB input support is live in Skill Seekers v3.6.0 (`epub_scraper.py`, `arguments/epub.py`, `parsers/epub_parser.py`, 107+ tests).\n\n# Add EPUB Input Support — Implementation Plan\n\n## Overview\n\nAdd `.epub` as an input format for Skill Seekers, enabling `skill-seekers create book.epub` and `skill-seekers epub --epub book.epub`. Follows the established Word/PDF scraper pattern: source detection → routing → extraction → categorize → build skill.\n\n**Authoritative reference**: [W3C EPUB 3.3 Specification](https://www.w3.org/TR/epub-33/) (also covers EPUB 2 backward compatibility).\n\n## Current State Analysis\n\nThe codebase has a consistent multi-layer architecture for document input formats. PDF and Word (.docx) serve as direct analogs. The Word scraper (`word_scraper.py`) is the closest pattern match since both Word and EPUB produce HTML/XHTML that is parsed with BeautifulSoup.\n\n### Key Discoveries:\n- Word scraper converts `.docx` → HTML (via mammoth) → BeautifulSoup parse → intermediate JSON → SKILL.md (`word_scraper.py:96-235`)\n- EPUB files contain XHTML natively (per W3C spec §5), so the mammoth conversion step is unnecessary — BeautifulSoup can parse EPUB XHTML content directly\n- Source detection uses file extension matching (`source_detector.py:57-65`)\n- Optional dependencies use a guard pattern with `try/except ImportError` and a `_check_*_deps()` function (`word_scraper.py:21-40`)\n- The `ebooklib` library (v0.18+) provides `epub.read_epub()` returning an `EpubBook` with spine iteration, metadata access via `get_metadata('DC', key)`, and item content via `get_content()`/`get_body_content()`\n- ebooklib has a known bug: EPUB 3 files read TOC from NCX instead of NAV (issue #200); workaround: `options={\"ignore_ncx\": True}`\n- ebooklib loads entire EPUB into memory — acceptable for typical books but relevant for edge cases\n\n## Desired End State\n\nRunning `skill-seekers create book.epub` produces:\n```\noutput/book/\n├── SKILL.md              # Main skill file with metadata, concepts, code examples\n├── references/\n│   ├── index.md          # Category index with statistics\n│   └── book.md           # Chapter content (or multiple files if categorized)\n├── scripts/\n└── assets/\n    └── *.png|*.jpg       # Extracted images\n```\n\n### CLI Output Mockup\n\n```\n$ skill-seekers create programming-rust.epub\n\nℹ️  Detected source type: epub\nℹ️  Routing to epub scraper...\n\n🔍 Extracting from EPUB: programming-rust.epub\n   Title: Programming Rust, 2nd Edition\n   Author: Jim Blandy, Jason Orendorff\n   Language: en\n   Chapters: 23 (spine items)\n\n📄 Processing chapters...\n   Chapter 1/23: Why Rust? (2 sections, 1 code block)\n   Chapter 2/23: A Tour of Rust (5 sections, 12 code blocks)\n   ...\n   Chapter 23/23: Macros (4 sections, 8 code blocks)\n\n📊 Extraction complete:\n   Sections: 142\n   Code blocks: 287 (Rust: 245, Shell: 28, TOML: 14)\n   Images: 34\n   Tables: 12\n\n💾 Saved extracted data to: output/programming-rust_extracted.json\n\n📋 Categorizing content...\n✅ Created 1 category (single EPUB source)\n   - programming-rust: 142 sections\n\n📝 Generating reference files...\n   Generated: output/programming-rust/references/programming-rust.md\n   Generated: output/programming-rust/references/index.md\n\n✅ Skill built successfully: output/programming-rust/\n\n📦 Next step: Package with: skill-seekers package output/programming-rust/\n```\n\n### Verification:\n- [x] `skill-seekers create book.epub` produces valid output directory\n- [x] `skill-seekers create book.epub --name mybook` works standalone\n- [x] `skill-seekers create book.epub --dry-run` shows config without processing\n- [x] All ~2,540+ existing tests still pass (982 passed, 1 pre-existing failure)\n- [x] New test suite has 100+ tests covering happy path, errors, and edge cases (107 tests, 14 classes)\n\n## What We're NOT Doing\n\n- DRM decryption (detect and error gracefully with clear message)\n- EPUB writing/creation (read-only)\n- Media overlay / audio / video extraction (ignore gracefully)\n- Fixed-layout OCR (detect and warn; extract whatever text exists in XHTML)\n- `--chapter-range` flag (can be added later)\n- Unified scraper (`unified_scraper.py`) EPUB support (separate future task)\n- MCP tool for EPUB (separate future task)\n\n## Implementation Approach\n\nFollow the Word scraper pattern exactly, with EPUB-specific extraction logic:\n\n1. **Phase 1**: Core `epub_scraper.py` — the `EpubToSkillConverter` class\n2. **Phase 2**: CLI integration — source detection, arguments, parser, routing, entry points\n3. **Phase 3**: Comprehensive test suite — 100+ tests across 11 test classes\n4. **Phase 4**: Documentation updates\n\n---\n\n## Phase 1: Core EPUB Scraper\n\n### Overview\nCreate `epub_scraper.py` with `EpubToSkillConverter` class following the Word scraper pattern. This is the bulk of new code.\n\n### Changes Required:\n\n#### [x] 1. Optional dependency in pyproject.toml\n**File**: `pyproject.toml`\n**Changes**: Add `epub` optional dependency group and include in `all` group\n\n```toml\n# After the docx group (~line 115)\n# EPUB (.epub) support\nepub = [\n    \"ebooklib>=0.18\",\n]\n```\n\nAdd `\"ebooklib>=0.18\",` to the `all` group (~line 178).\n\n#### [x] 2. Create `src/skill_seekers/cli/epub_scraper.py`\n**File**: `src/skill_seekers/cli/epub_scraper.py` (new)\n**Changes**: Full EPUB scraper module\n\n**Structure** (following `word_scraper.py` pattern):\n\n```python\n\"\"\"\nEPUB Documentation to Skill Converter\n\nConverts EPUB e-books into skills.\nUses ebooklib for EPUB parsing, BeautifulSoup for XHTML content extraction.\n\nUsage:\n    skill-seekers create book.epub --name myskill\n    skill-seekers create book_extracted.json\n\"\"\"\n\nimport argparse\nimport json\nimport logging\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n# Optional dependency guard\ntry:\n    import ebooklib\n    from ebooklib import epub\n    EPUB_AVAILABLE = True\nexcept ImportError:\n    EPUB_AVAILABLE = False\n\n# BeautifulSoup is a core dependency (always available)\nfrom bs4 import BeautifulSoup, Comment\n\nlogger = logging.getLogger(__name__)\n\n\ndef _check_epub_deps():\n    \"\"\"Raise RuntimeError if ebooklib is not installed.\"\"\"\n    if not EPUB_AVAILABLE:\n        raise RuntimeError(\n            \"ebooklib is required for EPUB support.\\n\"\n            'Install with: pip install \"skill-seekers[epub]\"\\n'\n            \"Or: pip install ebooklib\"\n        )\n\n\ndef infer_description_from_epub(metadata: dict | None = None, name: str = \"\") -> str:\n    \"\"\"Infer skill description from EPUB metadata.\"\"\"\n    if metadata:\n        if metadata.get(\"description\") and len(metadata[\"description\"]) > 20:\n            desc = metadata[\"description\"].strip()\n            if len(desc) > 150:\n                desc = desc[:147] + \"...\"\n            return f\"Use when {desc.lower()}\"\n        if metadata.get(\"title\") and len(metadata[\"title\"]) > 10:\n            return f\"Use when working with {metadata['title'].lower()}\"\n    return (\n        f\"Use when referencing {name} documentation\"\n        if name\n        else \"Use when referencing this documentation\"\n    )\n```\n\n**`EpubToSkillConverter` class methods:**\n\n```python\nclass EpubToSkillConverter:\n    def __init__(self, config: dict):\n        self.config = config\n        self.name = config[\"name\"]\n        self.epub_path = config.get(\"epub_path\", \"\")\n        self.description = config.get(\n            \"description\", f\"Use when referencing {self.name} documentation\"\n        )\n        self.skill_dir = f\"output/{self.name}\"\n        self.data_file = f\"output/{self.name}_extracted.json\"\n        self.categories = config.get(\"categories\", {})\n        self.extracted_data = None\n\n    def extract_epub(self) -> bool:\n        \"\"\"Extract content from EPUB file.\n\n        Workflow:\n        1. Check dependencies (ebooklib)\n        2. Detect DRM via META-INF/encryption.xml (fail fast)\n        3. Read EPUB via ebooklib with ignore_ncx=True (EPUB 3 TOC bug workaround)\n        4. Extract Dublin Core metadata (title, creator, language, publisher, date, description, subject)\n        5. Iterate spine items in reading order\n        6. For each ITEM_DOCUMENT: parse XHTML with BeautifulSoup\n        7. Split by h1/h2 heading boundaries into sections\n        8. Extract code blocks from <pre>/<code> elements\n        9. Extract images from EpubImage items\n        10. Detect code languages via LanguageDetector\n        11. Save intermediate JSON to {name}_extracted.json\n\n        Returns True on success.\n        Raises RuntimeError for DRM-protected files.\n        Raises FileNotFoundError for missing files.\n        Raises ValueError for invalid EPUB files.\n        \"\"\"\n```\n\n**DRM detection** (per W3C spec §4.2.6.3.2):\n\n```python\ndef _detect_drm(self, book) -> bool:\n    \"\"\"Detect DRM by checking for encryption.xml with non-font-obfuscation entries.\n\n    Per W3C EPUB 3.3 spec: encryption.xml is present when resources are encrypted.\n    Font obfuscation (IDPF algorithm http://www.idpf.org/2008/embedding or\n    Adobe algorithm http://ns.adobe.com/pdf/enc#RC) is NOT DRM — only font mangling.\n\n    Actual DRM uses algorithms like:\n    - Adobe ADEPT: http://ns.adobe.com/adept namespace\n    - Apple FairPlay: http://itunes.apple.com/dataenc\n    - Readium LCP: http://readium.org/2014/01/lcp\n    \"\"\"\n```\n\n**Metadata extraction** (per W3C spec §5.2, Dublin Core):\n\n```python\ndef _extract_metadata(self, book) -> dict:\n    \"\"\"Extract Dublin Core metadata from EPUB.\n\n    Per W3C EPUB 3.3 spec: required elements are dc:identifier, dc:title, dc:language.\n    Optional: dc:creator, dc:contributor, dc:date, dc:description, dc:publisher,\n    dc:subject, dc:rights, dc:type, dc:coverage, dc:source, dc:relation, dc:format.\n\n    ebooklib API: book.get_metadata('DC', key) returns list of (value, attrs) tuples.\n    \"\"\"\n    def _get_one(key):\n        data = book.get_metadata('DC', key)\n        return data[0][0] if data else None\n\n    def _get_list(key):\n        data = book.get_metadata('DC', key)\n        return [x[0] for x in data] if data else []\n\n    return {\n        \"title\": _get_one('title') or \"Untitled\",\n        \"author\": \", \".join(_get_list('creator')) or None,\n        \"language\": _get_one('language') or \"en\",\n        \"publisher\": _get_one('publisher'),\n        \"date\": _get_one('date'),\n        \"description\": _get_one('description'),\n        \"subject\": \", \".join(_get_list('subject')) or None,\n        \"rights\": _get_one('rights'),\n        \"identifier\": _get_one('identifier'),\n    }\n```\n\n**Content extraction** (per W3C spec §5 — XHTML Content Documents use XML serialization of HTML5):\n\n```python\ndef _extract_spine_content(self, book) -> list[dict]:\n    \"\"\"Extract content from spine items in reading order.\n\n    Per W3C EPUB 3.3 spec §3.4.8: spine defines ordered list of content documents.\n    Linear=\"yes\" (default) items form the primary reading order.\n    Linear=\"no\" items are auxiliary (footnotes, glossary).\n\n    Per spec §5: XHTML content documents use XML syntax of HTML5.\n    Parse with BeautifulSoup, split by h1/h2 heading boundaries.\n    \"\"\"\n    sections = []\n    section_number = 0\n\n    for item_id, linear in book.spine:\n        item = book.get_item_with_id(item_id)\n        if not item or item.get_type() != ebooklib.ITEM_DOCUMENT:\n            continue\n\n        soup = BeautifulSoup(item.get_content(), 'html.parser')\n\n        # Remove scripts, styles, comments (not useful for text extraction)\n        for tag in soup(['script', 'style']):\n            tag.decompose()\n        for comment in soup.find_all(string=lambda t: isinstance(t, Comment)):\n            comment.extract()\n\n        body = soup.find('body')\n        if not body:\n            continue\n\n        # Split by h1/h2 heading boundaries (same as word_scraper)\n        # Each heading starts a new section\n        ...\n```\n\n**Image extraction** (per W3C spec §3.3 — core media types include JPEG, PNG, GIF, WebP, SVG):\n\n```python\ndef _extract_images(self, book) -> list[dict]:\n    \"\"\"Extract images from EPUB manifest.\n\n    Per W3C EPUB 3.3 spec §3.3: core image media types are\n    image/gif, image/jpeg, image/png, image/svg+xml, image/webp.\n\n    ebooklib API: book.get_items_of_type(ebooklib.ITEM_IMAGE)\n    returns EpubImage items with get_content() (bytes) and media_type.\n\n    SVG images (ITEM_VECTOR) handled separately.\n    \"\"\"\n```\n\n**The remaining methods** (`categorize_content`, `build_skill`, `_generate_reference_file`, `_generate_index`, `_generate_skill_md`, `_format_key_concepts`, `_format_patterns_from_content`, `_sanitize_filename`) follow the Word scraper pattern exactly — they operate on the same intermediate JSON structure.\n\n**`main()` function** (following `word_scraper.py:923-1059`):\n\n```python\ndef main():\n    from .arguments.epub import add_epub_arguments\n\n    parser = argparse.ArgumentParser(\n        description=\"Convert EPUB e-book to skill\",\n        formatter_class=argparse.RawDescriptionHelpFormatter,\n    )\n    add_epub_arguments(parser)\n    args = parser.parse_args()\n\n    # Logging setup\n    if getattr(args, \"quiet\", False):\n        logging.getLogger().setLevel(logging.WARNING)\n    elif getattr(args, \"verbose\", False):\n        logging.getLogger().setLevel(logging.DEBUG)\n\n    # Dry run\n    if getattr(args, \"dry_run\", False):\n        source = args.epub or args.from_json or \"(none)\"\n        print(f\"\\n{'=' * 60}\")\n        print(\"DRY RUN: EPUB Extraction\")\n        print(f\"{'=' * 60}\")\n        print(f\"Source:         {source}\")\n        print(f\"Name:           {getattr(args, 'name', None) or '(auto-detect)'}\")\n        print(f\"Enhance level:  {getattr(args, 'enhance_level', 0)}\")\n        print(f\"\\n✅ Dry run complete\")\n        return\n\n    # Validate inputs\n    if not (args.epub or args.from_json):\n        parser.error(\"Must specify --epub or --from-json\")\n\n    # From-JSON workflow\n    if args.from_json:\n        name = Path(args.from_json).stem.replace(\"_extracted\", \"\")\n        config = {\n            \"name\": name,\n            \"description\": args.description or f\"Use when referencing {name} documentation\",\n        }\n        converter = EpubToSkillConverter(config)\n        converter.load_extracted_data(args.from_json)\n        converter.build_skill()\n        return\n\n    # Direct EPUB workflow\n    name = args.name or Path(args.epub).stem\n    config = {\n        \"name\": name,\n        \"epub_path\": args.epub,\n        \"description\": args.description or f\"Use when referencing {name} documentation\",\n    }\n\n    try:\n        converter = EpubToSkillConverter(config)\n        if not converter.extract_epub():\n            print(\"\\n❌ EPUB extraction failed\", file=sys.stderr)\n            sys.exit(1)\n        converter.build_skill()\n\n        # Enhancement workflow integration\n        from skill_seekers.cli.workflow_runner import run_workflows\n        run_workflows(args)\n\n        # Traditional enhancement\n        if getattr(args, \"enhance_level\", 0) > 0:\n            # Same pattern as word_scraper.py and pdf_scraper.py\n            ...\n\n    except RuntimeError as e:\n        print(f\"\\n❌ Error: {e}\", file=sys.stderr)\n        sys.exit(1)\n```\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `ruff check src/skill_seekers/cli/epub_scraper.py` passes\n- [x] `ruff format --check src/skill_seekers/cli/epub_scraper.py` passes\n- [ ] `mypy src/skill_seekers/cli/epub_scraper.py` passes (continue-on-error)\n- [x] `pip install -e \".[epub]\"` installs successfully\n\n#### Manual Verification:\n- [x] Verify `import ebooklib` works after install\n- [x] Review epub_scraper.py structure matches word_scraper.py pattern\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding to the next phase.\n\n---\n\n## Phase 2: CLI Integration\n\n### Overview\nWire the EPUB scraper into the CLI: source detection, argument definitions, parser registration, create command routing, and entry points.\n\n### Changes Required:\n\n#### [x] 1. Source detection\n**File**: `src/skill_seekers/cli/source_detector.py`\n**Changes**: Add `.epub` extension detection, `_detect_epub()` method, validation, and error message update\n\nAdd after the `.docx` check (line 64):\n```python\nif source.endswith(\".epub\"):\n    return cls._detect_epub(source)\n```\n\nAdd `_detect_epub()` method (following `_detect_word()` at line 124):\n```python\n@classmethod\ndef _detect_epub(cls, source: str) -> SourceInfo:\n    \"\"\"Detect EPUB file source.\"\"\"\n    name = os.path.splitext(os.path.basename(source))[0]\n    return SourceInfo(\n        type=\"epub\", parsed={\"file_path\": source}, suggested_name=name, raw_input=source\n    )\n```\n\nAdd epub validation in `validate_source()` (after word block at line 278):\n```python\nelif source_info.type == \"epub\":\n    file_path = source_info.parsed[\"file_path\"]\n    if not os.path.exists(file_path):\n        raise ValueError(f\"EPUB file does not exist: {file_path}\")\n    if not os.path.isfile(file_path):\n        raise ValueError(f\"Path is not a file: {file_path}\")\n```\n\nAdd EPUB example to the ValueError message (line 94):\n```python\n\"  EPUB:  skill-seekers create ebook.epub\\n\"\n```\n\n#### [x] 2. Argument definitions\n**File**: `src/skill_seekers/cli/arguments/epub.py` (new)\n**Changes**: EPUB-specific argument definitions\n\n```python\n\"\"\"EPUB-specific CLI arguments.\"\"\"\n\nimport argparse\nfrom typing import Any\n\nfrom .common import add_all_standard_arguments\n\nEPUB_ARGUMENTS: dict[str, dict[str, Any]] = {\n    \"epub\": {\n        \"flags\": (\"--epub\",),\n        \"kwargs\": {\n            \"type\": str,\n            \"help\": \"Direct EPUB file path\",\n            \"metavar\": \"PATH\",\n        },\n    },\n    \"from_json\": {\n        \"flags\": (\"--from-json\",),\n        \"kwargs\": {\n            \"type\": str,\n            \"help\": \"Build skill from extracted JSON\",\n            \"metavar\": \"FILE\",\n        },\n    },\n}\n\n\ndef add_epub_arguments(parser: argparse.ArgumentParser) -> None:\n    \"\"\"Add EPUB-specific arguments to parser.\"\"\"\n    add_all_standard_arguments(parser)\n\n    # Override enhance-level default to 0 for EPUB\n    for action in parser._actions:\n        if hasattr(action, \"dest\") and action.dest == \"enhance_level\":\n            action.default = 0\n            action.help = (\n                \"AI enhancement level (auto-detects API vs LOCAL mode): \"\n                \"0=disabled (default for EPUB), 1=SKILL.md only, \"\n                \"2=+architecture/config, 3=full enhancement. \"\n                \"Mode selection: uses API if ANTHROPIC_API_KEY is set, \"\n                \"otherwise LOCAL (Claude Code)\"\n            )\n\n    for arg_name, arg_def in EPUB_ARGUMENTS.items():\n        parser.add_argument(*arg_def[\"flags\"], **arg_def[\"kwargs\"])\n```\n\n#### [x] 3. Create command argument integration\n**File**: `src/skill_seekers/cli/arguments/create.py`\n**Changes**: Add EPUB_ARGUMENTS dict, register in helper functions, add mode handling\n\nAdd after WORD_ARGUMENTS (~line 411):\n```python\n# EPUB specific (from epub.py)\nEPUB_ARGUMENTS: dict[str, dict[str, Any]] = {\n    \"epub\": {\n        \"flags\": (\"--epub\",),\n        \"kwargs\": {\n            \"type\": str,\n            \"help\": \"EPUB file path\",\n            \"metavar\": \"PATH\",\n        },\n    },\n}\n```\n\nAdd to `get_source_specific_arguments()` (line 595):\n```python\n\"epub\": EPUB_ARGUMENTS,\n```\n\nAdd to `add_create_arguments()` (after word block at line 678):\n```python\nif mode in [\"epub\", \"all\"]:\n    for arg_name, arg_def in EPUB_ARGUMENTS.items():\n        parser.add_argument(*arg_def[\"flags\"], **arg_def[\"kwargs\"])\n```\n\n#### [x] 4. Parser class\n**File**: `src/skill_seekers/cli/parsers/epub_parser.py` (new)\n**Changes**: Subcommand parser for standalone `skill-seekers epub` command\n\n```python\n\"\"\"Parser for epub subcommand.\"\"\"\n\nfrom .base import SubcommandParser\nfrom skill_seekers.cli.arguments.epub import add_epub_arguments\n\n\nclass EpubParser(SubcommandParser):\n    \"\"\"Parser for EPUB extraction command.\"\"\"\n\n    @property\n    def name(self) -> str:\n        return \"epub\"\n\n    @property\n    def help(self) -> str:\n        return \"Extract from EPUB e-book (.epub)\"\n\n    @property\n    def description(self) -> str:\n        return \"Extract content from EPUB e-book (.epub) and generate skill\"\n\n    def add_arguments(self, parser):\n        add_epub_arguments(parser)\n```\n\n#### [x] 5. Parser registration\n**File**: `src/skill_seekers/cli/parsers/__init__.py`\n**Changes**: Import and register EpubParser\n\nAdd import (after WordParser import, line 15):\n```python\nfrom .epub_parser import EpubParser\n```\n\nAdd to PARSERS list (after `WordParser()`, line 46):\n```python\nEpubParser(),\n```\n\n#### [x] 6. CLI dispatcher\n**File**: `src/skill_seekers/cli/main.py`\n**Changes**: Add epub to COMMAND_MODULES dict and module docstring\n\nAdd to COMMAND_MODULES (after \"word\" entry, line 52):\n```python\n\"epub\": \"skill_seekers.cli.epub_scraper\",\n```\n\nAdd to module docstring (after \"word\" line, line 15):\n```python\n#    epub                 Extract from EPUB e-book (.epub)\n```\n\n#### [x] 7. Create command routing\n**File**: `src/skill_seekers/cli/create_command.py`\n**Changes**: Add `_route_epub()` method, routing case, help flag, and epilog example\n\nAdd to `_route_to_scraper()` (after word case, line 136):\n```python\nelif self.source_info.type == \"epub\":\n    return self._route_epub()\n```\n\nAdd `_route_epub()` method (after `_route_word()`, line 352):\n```python\ndef _route_epub(self) -> int:\n    \"\"\"Route to EPUB scraper (epub_scraper.py).\"\"\"\n    from skill_seekers.cli import epub_scraper\n\n    argv = [\"epub_scraper\"]\n    file_path = self.source_info.parsed[\"file_path\"]\n    argv.extend([\"--epub\", file_path])\n    self._add_common_args(argv)\n\n    logger.debug(f\"Calling epub_scraper with argv: {argv}\")\n    original_argv = sys.argv\n    try:\n        sys.argv = argv\n        return epub_scraper.main()\n    finally:\n        sys.argv = original_argv\n```\n\nAdd to epilog (line 543, after DOCX example):\n```python\n  EPUB:     skill-seekers create ebook.epub\n```\n\nAdd to Source Auto-Detection section:\n```python\n  • file.epub → EPUB extraction\n```\n\nAdd `--help-epub` flag and handler (after `--help-word` at line 592):\n```python\nparser.add_argument(\n    \"--help-epub\", action=\"store_true\", help=argparse.SUPPRESS, dest=\"_help_epub\"\n)\n```\n\nAdd handler block (after `_help_word` block at line 654):\n```python\nelif args._help_epub:\n    parser_epub = argparse.ArgumentParser(\n        prog=\"skill-seekers create\",\n        description=\"Create skill from EPUB e-book (.epub)\",\n        formatter_class=argparse.RawDescriptionHelpFormatter,\n    )\n    add_create_arguments(parser_epub, mode=\"epub\")\n    parser_epub.print_help()\n    return 0\n```\n\n#### [x] 8. Entry point\n**File**: `pyproject.toml`\n**Changes**: Add standalone entry point\n\nAdd after `skill-seekers-word` (line 224):\n```toml\nskill-seekers-epub = \"skill_seekers.cli.epub_scraper:main\"\n```\n\n#### [x] 9. Positional argument handling in main.py\n**File**: `src/skill_seekers/cli/main.py`\n**Changes**: Add \"input_file\" is already in the positional list at line 153, so no change needed. Verify `_reconstruct_argv` handles epub correctly through the standard delegation path.\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `ruff check src/skill_seekers/cli/source_detector.py src/skill_seekers/cli/arguments/epub.py src/skill_seekers/cli/parsers/epub_parser.py src/skill_seekers/cli/create_command.py` passes\n- [x] `ruff format --check src/skill_seekers/cli/` passes\n- [x] `pip install -e \".[epub]\"` installs with all entry points\n- [x] `skill-seekers create --help` shows EPUB-specific help\n- [x] `skill-seekers create --help-epub` shows EPUB arguments (via standalone entry point `skill-seekers-create`)\n- [x] `skill-seekers create nonexistent.epub` gives clear error about missing file\n- [x] Existing tests still pass: `pytest tests/ -v -x -m \"not slow and not integration\"` (875 passed, 1 pre-existing unrelated failure in test_git_sources_e2e)\n\n#### Manual Verification:\n- [x] `skill-seekers --help` lists `epub` command\n- [x] `skill-seekers create book.epub --dry-run` shows dry run output\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding to the next phase.\n\n---\n\n## Phase 3: Comprehensive Test Suite\n\n### Overview\nCreate `tests/test_epub_scraper.py` with 100+ tests across 11 test classes, covering happy path, negative cases, edge cases, and CLI integration.\n\n### Changes Required:\n\n#### [x] 1. Create test file\n**File**: `tests/test_epub_scraper.py` (new)\n**Changes**: Comprehensive test suite following `test_word_scraper.py` patterns\n\n```python\n\"\"\"\nTests for EPUB scraper (epub_scraper.py).\n\nCovers: initialization, extraction, categorization, skill building,\ncode blocks, tables, images, error handling, JSON workflow, CLI arguments,\nhelper functions, source detection, DRM detection, and edge cases.\n\nTests use mock data and do not require actual EPUB files or ebooklib installed.\n\"\"\"\n\nimport json\nimport os\nimport shutil\nimport tempfile\nimport unittest\nfrom pathlib import Path\nfrom unittest.mock import MagicMock, patch, PropertyMock\n\n\n# Conditional import (same pattern as test_word_scraper.py)\ntry:\n    from skill_seekers.cli.epub_scraper import (\n        EpubToSkillConverter,\n        infer_description_from_epub,\n        _score_code_quality,\n        _check_epub_deps,\n        EPUB_AVAILABLE,\n    )\n    IMPORT_OK = True\nexcept ImportError:\n    IMPORT_OK = False\n```\n\n**Helper factory function:**\n\n```python\ndef _make_sample_extracted_data(\n    num_sections=2,\n    include_code=False,\n    include_tables=False,\n    include_images=False,\n) -> dict:\n    \"\"\"Create minimal extracted_data dict for testing.\"\"\"\n    sections = []\n    total_code = 0\n    total_images = 0\n    languages = {}\n\n    for i in range(1, num_sections + 1):\n        section = {\n            \"section_number\": i,\n            \"heading\": f\"Chapter {i}\",\n            \"heading_level\": \"h1\",\n            \"text\": f\"Content of chapter {i}. This is sample text.\",\n            \"headings\": [{\"level\": \"h2\", \"text\": f\"Section {i}.1\"}],\n            \"code_samples\": [],\n            \"tables\": [],\n            \"images\": [],\n        }\n\n        if include_code:\n            section[\"code_samples\"] = [\n                {\"code\": f\"def func_{i}():\\n    return {i}\", \"language\": \"python\", \"quality_score\": 7.5},\n                {\"code\": f\"console.log({i})\", \"language\": \"javascript\", \"quality_score\": 4.0},\n            ]\n            total_code += 2\n            languages[\"python\"] = languages.get(\"python\", 0) + 1\n            languages[\"javascript\"] = languages.get(\"javascript\", 0) + 1\n\n        if include_tables:\n            section[\"tables\"] = [\n                {\"headers\": [\"Name\", \"Value\"], \"rows\": [[\"key\", \"val\"]]}\n            ]\n\n        if include_images:\n            section[\"images\"] = [\n                {\"index\": 1, \"data\": b\"\\x89PNG\\r\\n\\x1a\\n\", \"width\": 100, \"height\": 100}\n            ]\n            total_images += 1\n\n        sections.append(section)\n\n    return {\n        \"source_file\": \"test.epub\",\n        \"metadata\": {\n            \"title\": \"Test Book\",\n            \"author\": \"Test Author\",\n            \"language\": \"en\",\n            \"publisher\": \"Test Publisher\",\n            \"date\": \"2024-01-01\",\n            \"description\": \"A test book for unit testing\",\n            \"subject\": \"Testing, Unit Tests\",\n            \"rights\": \"Copyright 2024\",\n            \"identifier\": \"urn:uuid:12345\",\n        },\n        \"total_sections\": num_sections,\n        \"total_code_blocks\": total_code,\n        \"total_images\": total_images,\n        \"languages_detected\": languages,\n        \"pages\": sections,\n    }\n```\n\n### Test Classes and Methods:\n\n#### [x] Class 1: `TestEpubToSkillConverterInit` (8 tests)\n\n**Happy path:**\n- `test_init_with_name_and_epub_path` — basic config with name + epub_path\n- `test_init_with_full_config` — config with all fields (name, epub_path, description, categories)\n- `test_default_description_uses_name` — description defaults to \"Use when referencing {name} documentation\"\n- `test_skill_dir_uses_name` — skill_dir is `output/{name}`\n- `test_data_file_uses_name` — data_file is `output/{name}_extracted.json`\n\n**Negative:**\n- `test_init_requires_name` — missing \"name\" key raises KeyError\n- `test_init_empty_name` — empty string name still works (no crash)\n\n**Edge case:**\n- `test_init_with_special_characters_in_name` — name with spaces/dashes sanitized for paths\n\n#### [x] Class 2: `TestEpubExtraction` (12 tests)\n\n**Happy path:**\n- `test_extract_basic_epub` — mock ebooklib, verify sections extracted in spine order\n- `test_extract_metadata` — verify Dublin Core metadata extraction (title, creator, language, etc.)\n- `test_extract_multiple_chapters` — multiple spine items produce multiple sections\n- `test_extract_code_blocks` — `<pre><code>` elements extracted with language detection\n- `test_extract_images` — ITEM_IMAGE items extracted with correct content\n- `test_heading_boundary_splitting` — h1/h2 boundaries create new sections\n\n**Negative:**\n- `test_extract_missing_file_raises_error` — FileNotFoundError for nonexistent path\n- `test_extract_invalid_epub_raises_error` — ValueError for corrupted/non-EPUB file\n- `test_extract_deps_not_installed` — RuntimeError with install instructions when ebooklib missing\n\n**Edge cases:**\n- `test_extract_empty_spine` — EPUB with no spine items produces empty sections list\n- `test_extract_spine_item_no_body` — XHTML without `<body>` tag skipped gracefully\n- `test_extract_non_linear_spine_items` — linear=\"no\" items still extracted (included but flagged)\n\n#### [x] Class 3: `TestEpubDrmDetection` (6 tests)\n\n**Happy path:**\n- `test_no_drm_detected` — normal EPUB without encryption.xml returns False\n\n**Negative:**\n- `test_drm_detected_adobe_adept` — encryption.xml with Adobe namespace raises RuntimeError\n- `test_drm_detected_apple_fairplay` — encryption.xml with Apple namespace raises RuntimeError\n- `test_drm_detected_readium_lcp` — encryption.xml with Readium namespace raises RuntimeError\n\n**Edge cases:**\n- `test_font_obfuscation_not_drm` — encryption.xml with only IDPF font obfuscation algorithm (`http://www.idpf.org/2008/embedding`) is NOT DRM, extraction proceeds\n- `test_drm_error_message_is_clear` — error message mentions DRM and suggests removing protection\n\n#### [x] Class 4: `TestEpubCategorization` (8 tests)\n\n**Happy path:**\n- `test_single_source_creates_one_category` — single EPUB creates category named after file\n- `test_keyword_categorization` — sections matched to categories by keyword scoring\n- `test_no_categories_uses_default` — no category config creates single \"content\" category\n\n**Negative:**\n- `test_categorize_empty_sections` — empty sections list produces empty categories\n- `test_categorize_no_keyword_matches` — unmatched sections go to \"other\" category\n\n**Edge cases:**\n- `test_categorize_single_section` — one section creates one category\n- `test_categorize_many_sections` — 50+ sections categorized correctly\n- `test_categorize_preserves_section_order` — sections maintain original order within categories\n\n#### [x] Class 5: `TestEpubSkillBuilding` (10 tests)\n\n**Happy path:**\n- `test_build_creates_directory_structure` — output/{name}/, references/, scripts/, assets/ created\n- `test_build_generates_skill_md` — SKILL.md created with YAML frontmatter\n- `test_build_generates_reference_files` — reference markdown files created per category\n- `test_build_generates_index` — references/index.md created with category links\n- `test_skill_md_contains_metadata` — SKILL.md includes title, author, language from metadata\n- `test_skill_md_yaml_frontmatter` — frontmatter has name and description fields\n\n**Negative:**\n- `test_build_without_extracted_data_fails` — calling build_skill() before extraction raises error\n\n**Edge cases:**\n- `test_build_overwrites_existing_output` — re-running build overwrites existing files\n- `test_build_with_long_name` — name > 64 chars truncated in YAML frontmatter\n- `test_build_with_unicode_content` — Unicode text (CJK, Arabic, emoji) preserved correctly\n\n#### [x] Class 6: `TestEpubCodeBlocks` (8 tests)\n\n**Happy path:**\n- `test_code_blocks_included_in_reference_files` — code samples appear in reference markdown\n- `test_code_blocks_in_skill_md_top_15` — SKILL.md shows top 15 code examples by quality\n- `test_code_language_grouped` — code examples grouped by language in SKILL.md\n\n**Edge cases:**\n- `test_empty_code_block` — `<pre><code></code></pre>` with no content skipped\n- `test_code_block_with_html_entities` — `&lt;`, `&gt;`, `&amp;` decoded to `<`, `>`, `&`\n- `test_code_block_with_syntax_highlighting_spans` — `<span class=\"keyword\">` stripped, plain text preserved\n- `test_code_block_language_from_class` — `class=\"language-python\"`, `class=\"code-rust\"` detected\n- `test_code_quality_scoring` — scoring heuristic produces expected ranges (0-10)\n\n#### [x] Class 7: `TestEpubTables` (5 tests)\n\n**Happy path:**\n- `test_tables_in_reference_files` — tables rendered as markdown in reference files\n- `test_table_with_headers` — headers from `<thead>` used correctly\n\n**Edge cases:**\n- `test_table_no_thead` — first row used as headers when no `<thead>`\n- `test_empty_table` — empty `<table>` element handled gracefully\n- `test_table_with_colspan_rowspan` — complex tables don't crash (data may be imperfect)\n\n#### [x] Class 8: `TestEpubImages` (7 tests)\n\n**Happy path:**\n- `test_images_saved_to_assets` — image bytes written to assets/ directory\n- `test_image_references_in_markdown` — markdown `![Image](../assets/...)` references correct\n\n**Negative:**\n- `test_image_with_zero_bytes` — empty image content skipped\n\n**Edge cases:**\n- `test_svg_images_handled` — SVG items (ITEM_VECTOR) extracted or skipped gracefully\n- `test_image_filename_conflicts` — duplicate filenames disambiguated\n- `test_cover_image_identified` — cover image (ITEM_COVER) extracted\n- `test_many_images` — 100+ images extracted without error\n\n#### [x] Class 9: `TestEpubErrorHandling` (10 tests)\n\n**Negative / error cases:**\n- `test_missing_epub_file_raises_error` — FileNotFoundError for nonexistent path\n- `test_not_a_file_raises_error` — ValueError when path is a directory\n- `test_not_epub_extension_raises_error` — ValueError for .txt, .pdf, .doc files\n- `test_corrupted_zip_raises_error` — ValueError or RuntimeError for corrupted ZIP\n- `test_missing_container_xml` — ValueError for ZIP without META-INF/container.xml\n- `test_missing_opf_file` — ValueError when container.xml points to nonexistent OPF\n- `test_drm_protected_raises_error` — RuntimeError with clear DRM message\n- `test_empty_epub_raises_error` — ValueError for EPUB with no content documents\n- `test_ebooklib_not_installed_error` — RuntimeError with install instructions\n- `test_malformed_xhtml_handled_gracefully` — unclosed tags, invalid entities don't crash (BeautifulSoup tolerant parsing)\n\n#### [x] Class 10: `TestEpubJSONWorkflow` (6 tests)\n\n**Happy path:**\n- `test_load_extracted_json` — load previously extracted JSON\n- `test_build_from_json` — full workflow: load JSON → categorize → build\n- `test_json_round_trip` — extract → save JSON → load JSON → build produces same output\n\n**Negative:**\n- `test_load_invalid_json` — malformed JSON raises appropriate error\n- `test_load_nonexistent_json` — FileNotFoundError for missing file\n\n**Edge case:**\n- `test_json_with_missing_fields` — partial JSON (missing optional fields) still works\n\n#### [x] Class 11: `TestEpubCLIArguments` (8 tests)\n\n**Happy path:**\n- `test_epub_flag_accepted` — `--epub path.epub` parsed correctly\n- `test_from_json_flag_accepted` — `--from-json data.json` parsed correctly\n- `test_name_flag_accepted` — `--name mybook` parsed correctly\n- `test_enhance_level_default_zero` — enhance-level defaults to 0 for EPUB\n- `test_dry_run_flag` — `--dry-run` flag parsed correctly\n\n**Negative:**\n- `test_no_args_shows_error` — no `--epub` or `--from-json` shows error\n\n**Integration:**\n- `test_verbose_flag` — `--verbose` accepted\n- `test_quiet_flag` — `--quiet` accepted\n\n#### [x] Class 12: `TestEpubHelperFunctions` (6 tests)\n\n- `test_infer_description_from_metadata_description` — uses description field\n- `test_infer_description_from_metadata_title` — falls back to title\n- `test_infer_description_fallback` — falls back to name-based template\n- `test_infer_description_empty_metadata` — empty dict returns fallback\n- `test_score_code_quality_ranges` — scoring returns 0-10\n- `test_sanitize_filename` — special characters cleaned\n\n#### [x] Class 13: `TestEpubSourceDetection` (6 tests)\n\n- `test_epub_detected_as_epub_type` — `.epub` extension detected correctly\n- `test_epub_suggested_name` — filename stem used as suggested name\n- `test_epub_validation_missing_file` — validation raises ValueError for missing file\n- `test_epub_validation_not_a_file` — validation raises ValueError for directory\n- `test_epub_with_path` — `./books/test.epub` detected with correct file_path\n- `test_pdf_still_detected` — regression test: `.pdf` still detected as pdf type\n\n#### [x] Class 14: `TestEpubEdgeCases` (8 tests)\n\n**Per W3C EPUB 3.3 spec edge cases:**\n- `test_epub2_vs_epub3` — both versions parse successfully (ebooklib handles both)\n- `test_epub_no_toc` — EPUB without table of contents extracts using spine order\n- `test_epub_empty_chapters` — chapters with no text content skipped gracefully\n- `test_epub_single_chapter` — book with one spine item produces valid output\n- `test_epub_unicode_content` — CJK, Arabic, Cyrillic, emoji text preserved\n- `test_epub_large_section_count` — 100+ sections processed without error\n- `test_epub_nested_headings` — h3/h4/h5/h6 become sub-headings within sections\n- `test_fixed_layout_detected` — fixed-layout EPUB produces warning but still extracts text\n\n**Total: ~108 test methods across 14 classes**\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `pytest tests/test_epub_scraper.py -v` — all 107 tests pass\n- [x] `pytest tests/ -v -x -m \"not slow and not integration\"` — 982 passed (1 pre-existing unrelated failure in test_git_sources_e2e)\n- [x] `ruff check tests/test_epub_scraper.py` passes\n- [x] `ruff format --check tests/test_epub_scraper.py` passes\n- [x] Test count >= 100 methods (107 tests across 14 classes)\n\n#### Manual Verification:\n- [x] Review test coverage includes: happy path, negative, edge cases, CLI, source detection, DRM, JSON workflow\n- [x] Verify no tests require actual EPUB files or ebooklib installed (all use mocks/skipTest guards)\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding to the next phase.\n\n---\n\n## Phase 4: Documentation\n\n### Overview\nUpdate CLAUDE.md and CHANGELOG.md to reflect the new EPUB support.\n\n### Changes Required:\n\n#### [x] 1. Update CLAUDE.md\n**File**: `CLAUDE.md`\n**Changes**:\n\nAdd to Commands section (after pdf line):\n```\nskill-seekers create book.epub --name myskill\n```\n\nAdd to \"Unified create\" examples:\n```\nskill-seekers create book.epub\n```\n\nAdd to Key source files table:\n```\n| Core scraping | `cli/epub_scraper.py` |\n```\n\nAdd to \"Adding things → New create command flags\" section:\n```\n- Source-specific → `EPUB_ARGUMENTS`\n```\n\n#### [x] 2. Update CHANGELOG.md\n**File**: `CHANGELOG.md`\n**Changes**: Add entry for EPUB support under next version\n\n```markdown\n### Added\n- EPUB (.epub) input support via `skill-seekers create book.epub` or `skill-seekers epub --epub book.epub`\n- Extracts chapters, metadata, code blocks, images, and tables from EPUB 2 and EPUB 3 files\n- DRM detection with clear error messages\n- Optional dependency: `pip install \"skill-seekers[epub]\"`\n```\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `ruff check` passes on any modified files\n- [x] `pytest tests/ -v -x -m \"not slow and not integration\"` — all tests still pass (982 passed, 1 pre-existing failure)\n\n#### Manual Verification:\n- [x] CLAUDE.md accurately reflects new commands\n- [x] CHANGELOG.md entry is clear and complete\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding.\n\n---\n\n## Testing Strategy\n\n### Unit Tests (Phase 3 — ~108 tests):\n\n**By category:**\n| Category | Count | What's tested |\n|----------|-------|---------------|\n| Initialization | 8 | Config parsing, defaults, edge cases |\n| Extraction | 12 | Spine iteration, metadata, headings, code, images |\n| DRM detection | 6 | Adobe, Apple, Readium, font obfuscation (not DRM) |\n| Categorization | 8 | Single/multi category, keywords, empty, ordering |\n| Skill building | 10 | Directory structure, SKILL.md, references, index |\n| Code blocks | 8 | Extraction, quality, language detection, HTML entities |\n| Tables | 5 | Headers, no-thead fallback, empty, colspan |\n| Images | 7 | Save, references, SVG, conflicts, cover, many |\n| Error handling | 10 | Missing file, corrupt, DRM, no deps, malformed XHTML |\n| JSON workflow | 6 | Load, build, round-trip, invalid, missing fields |\n| CLI arguments | 8 | Flags, defaults, dry-run, verbose/quiet |\n| Helper functions | 6 | Description inference, quality scoring, filename sanitization |\n| Source detection | 6 | Detection, validation, regression |\n| Edge cases | 8 | EPUB 2/3, no TOC, empty chapters, Unicode, fixed-layout |\n\n### Integration Tests:\n- Full extract → categorize → build workflow with mock ebooklib\n- JSON round-trip (extract → save → load → build)\n\n### Manual Testing Steps:\n1. `pip install -e \".[epub]\"` — verify install\n2. `skill-seekers create book.epub` with a real EPUB file — verify output directory structure\n3. `skill-seekers create book.epub --dry-run` — verify dry run output\n4. `skill-seekers create drm-book.epub` — verify DRM error message\n5. `skill-seekers create nonexistent.epub` — verify file-not-found error\n6. Open generated `SKILL.md` — verify content quality and structure\n\n## Performance Considerations\n\n- ebooklib loads entire EPUB into memory. For typical books (<50MB), this is fine\n- For very large EPUBs (100MB+), memory usage may spike. No mitigation needed for v1 — document as known limitation\n- BeautifulSoup parsing of XHTML is fast. No performance concerns expected\n\n## Migration Notes\n\n- No migration needed — this is a new feature with no existing data to migrate\n- Optional dependency (`ebooklib`) means existing installs are unaffected\n- No breaking changes to any existing commands or APIs\n\n## References\n\n- [W3C EPUB 3.3 Specification](https://www.w3.org/TR/epub-33/) — authoritative source of truth\n- [W3C EPUB Reading Systems 3.3](https://www.w3.org/TR/epub-rs-33/) — reading system requirements\n- [ebooklib GitHub](https://github.com/aerkalov/ebooklib) — Python EPUB library\n- [ebooklib PyPI](https://pypi.org/project/EbookLib/) — v0.20, Python 3.9-3.13\n- [Research document](../research/2026-03-14-epub-input-support-affected-files.md) — affected files analysis\n- Similar implementation: `src/skill_seekers/cli/word_scraper.py` — closest analog\n- Similar tests: `tests/test_word_scraper.py` — test pattern template\n","frontmatter":{"date":"2026-03-14T19:30:35.172407+00:00","git_commit":"7c90a4b9c9bccac8341b0769550d77aae3b4e524","branch":"development","topic":"Add EPUB Input Support","tags":["plan","epub","scraper","input-format"],"status":"complete"},"isInternal":false,"tokens":10908,"sizeBytes":43484},{"name":"2026-03-14-epub-input-support-affected-files.md","path":"docs/agents/research/2026-03-14-epub-input-support-affected-files.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/docs/agents/research/2026-03-14-epub-input-support-affected-files.md","title":"Subagent: 2026-03-14-epub-input-support-affected-files","category":"subagent-persona","format":"markdown","content":"---\ndate: 2026-03-14T12:54:24.700367+00:00\ngit_commit: 7c90a4b9c9bccac8341b0769550d77aae3b4e524\nbranch: development\ntopic: \"What files would be affected to add .epub support for input\"\ntags: [research, codebase, epub, input-format, scraper]\nstatus: complete\n---\n\n> 🗄️ **Historical — completed** — This research informed the EPUB implementation that is now live in Skill Seekers v3.6.0.\n\n# Research: What files would be affected to add .epub support for input\n\n## Research Question\n\nWhat files would be affected to add .epub support for input.\n\n## Summary\n\nAdding `.epub` input support follows an established pattern already used for PDF and Word (.docx) formats. The codebase has a consistent multi-layer architecture for document input formats: source detection, argument definitions, parser registration, create command routing, standalone scraper module, and tests. Based on analysis of the existing PDF and Word implementations, **16 existing files would need modification** and **4 new files would need to be created**.\n\n## Detailed Findings\n\n### New Files to Create (4 files)\n\n| File | Purpose |\n|------|---------|\n| `src/skill_seekers/cli/epub_scraper.py` | Core EPUB extraction and skill building logic (analog: `word_scraper.py` at ~750 lines) |\n| `src/skill_seekers/cli/arguments/epub.py` | EPUB-specific argument definitions (analog: `arguments/word.py`) |\n| `src/skill_seekers/cli/parsers/epub_parser.py` | Subcommand parser class (analog: `parsers/word_parser.py`) |\n| `tests/test_epub_scraper.py` | Test suite (analog: `test_word_scraper.py` at ~750 lines, 130+ tests) |\n\n### Existing Files to Modify (16 files)\n\n#### 1. Source Detection Layer\n\n**`src/skill_seekers/cli/source_detector.py`** (3 locations)\n\n- **`SourceDetector.detect()`** (line ~60): Add `.epub` extension check, following the `.docx` pattern at line 63-64:\n  ```python\n  if source.endswith(\".epub\"):\n      return cls._detect_epub(source)\n  ```\n\n- **New method `_detect_epub()`**: Add detection method (following `_detect_word()` at lines 124-129):\n  ```python\n  @classmethod\n  def _detect_epub(cls, source: str) -> SourceInfo:\n      name = os.path.splitext(os.path.basename(source))[0]\n      return SourceInfo(\n          type=\"epub\", parsed={\"file_path\": source}, suggested_name=name, raw_input=source\n      )\n  ```\n\n- **`validate_source()`** (line ~250): Add epub validation block (following the word block at lines 273-278)\n\n- **Error message** (line ~94): Add EPUB example to the `ValueError` help text\n\n#### 2. CLI Dispatcher\n\n**`src/skill_seekers/cli/main.py`** (2 locations)\n\n- **`COMMAND_MODULES` dict** (line ~46): Add epub entry:\n  ```python\n  \"epub\": \"skill_seekers.cli.epub_scraper\",\n  ```\n\n- **Module docstring** (line ~1): Add `epub` to the commands list\n\n#### 3. Create Command Routing\n\n**`src/skill_seekers/cli/create_command.py`** (3 locations)\n\n- **`_route_to_scraper()`** (line ~121): Add `elif self.source_info.type == \"epub\":` routing case\n\n- **New `_route_epub()` method**: Following the `_route_word()` pattern at lines 331-352:\n  ```python\n  def _route_epub(self) -> int:\n      from skill_seekers.cli import epub_scraper\n      argv = [\"epub_scraper\"]\n      file_path = self.source_info.parsed[\"file_path\"]\n      argv.extend([\"--epub\", file_path])\n      self._add_common_args(argv)\n      # epub-specific args here\n      ...\n  ```\n\n- **`main()` epilog** (line ~537): Add EPUB example and source auto-detection entry\n\n- **Progressive help** (line ~590): Add `--help-epub` flag and handler block\n\n#### 4. Argument Definitions\n\n**`src/skill_seekers/cli/arguments/create.py`** (4 locations)\n\n- **New `EPUB_ARGUMENTS` dict** (~line 401): Define epub-specific arguments (e.g., `--epub` file path flag), following the `WORD_ARGUMENTS` pattern at lines 402-411\n\n- **`get_source_specific_arguments()`** (line 595): Add `\"epub\": EPUB_ARGUMENTS` to the `source_args` dict\n\n- **`add_create_arguments()`** (line 676): Add epub mode block:\n  ```python\n  if mode in [\"epub\", \"all\"]:\n      for arg_name, arg_def in EPUB_ARGUMENTS.items():\n          parser.add_argument(*arg_def[\"flags\"], **arg_def[\"kwargs\"])\n  ```\n\n#### 5. Parser Registration\n\n**`src/skill_seekers/cli/parsers/__init__.py`** (2 locations)\n\n- **Import** (line ~15): Add `from .epub_parser import EpubParser`\n\n- **`PARSERS` list** (line ~46): Add `EpubParser()` entry (near `WordParser()` and `PDFParser()`)\n\n#### 6. Package Configuration\n\n**`pyproject.toml`** (3 locations)\n\n- **`[project.optional-dependencies]`** (line ~111): Add `epub` optional dependency group:\n  ```toml\n  epub = [\n      \"ebooklib>=0.18\",\n  ]\n  ```\n\n- **`all` optional dependency group** (line ~178): Add epub dependency to the combined `all` group\n\n- **`[project.scripts]`** (line ~224): Add standalone entry point:\n  ```toml\n  skill-seekers-epub = \"skill_seekers.cli.epub_scraper:main\"\n  ```\n\n#### 7. Argument Commons\n\n**`src/skill_seekers/cli/arguments/common.py`**\n\n- No changes strictly required, but `add_all_standard_arguments()` is called by the new `arguments/epub.py` (no modification needed — it's used as-is)\n\n#### 8. Documentation / Configuration\n\n**`CLAUDE.md`** (2 locations)\n\n- **Commands section**: Add `epub` to the list of subcommands\n- **Key source files table**: Add `epub_scraper.py` entry\n\n**`CONTRIBUTING.md`** — Potentially update with epub format mention\n\n**`CHANGELOG.md`** — New feature entry\n\n### Files NOT Affected\n\nThese files do **not** need changes:\n\n- **`unified_scraper.py`** — Multi-source configs could add epub support later but it's not required for basic input support\n- **Platform adaptors** (`adaptors/*.py`) — Adaptors work on the output side (packaging), not input\n- **Enhancement system** (`enhance_skill.py`, `enhance_skill_local.py`) — Works generically on SKILL.md\n- **MCP server** (`mcp/server_fastmcp.py`) — Operates on completed skills\n- **`pdf_extractor_poc.py`** — PDF-specific extraction; epub needs its own extractor\n\n## Code References\n\n### Pattern to Follow (Word .docx implementation)\n\n- `src/skill_seekers/cli/word_scraper.py:1-750` — Full scraper with `WordToSkillConverter` class\n- `src/skill_seekers/cli/arguments/word.py:1-75` — Argument definitions with `add_word_arguments()`\n- `src/skill_seekers/cli/parsers/word_parser.py:1-33` — Parser class extending `SubcommandParser`\n- `tests/test_word_scraper.py:1-750` — Comprehensive test suite with 130+ tests\n\n### Key Integration Points\n\n- `src/skill_seekers/cli/source_detector.py:57-65` — File extension detection order\n- `src/skill_seekers/cli/source_detector.py:124-129` — `_detect_word()` method (template for `_detect_epub()`)\n- `src/skill_seekers/cli/create_command.py:121-143` — `_route_to_scraper()` dispatch\n- `src/skill_seekers/cli/create_command.py:331-352` — `_route_word()` (template for `_route_epub()`)\n- `src/skill_seekers/cli/arguments/create.py:401-411` — `WORD_ARGUMENTS` dict (template)\n- `src/skill_seekers/cli/arguments/create.py:595-604` — `get_source_specific_arguments()` mapping\n- `src/skill_seekers/cli/arguments/create.py:676-678` — `add_create_arguments()` mode handling\n- `src/skill_seekers/cli/parsers/__init__.py:35-59` — `PARSERS` registry list\n- `src/skill_seekers/cli/main.py:46-70` — `COMMAND_MODULES` dict\n- `pyproject.toml:111-115` — Optional dependency group pattern (docx)\n- `pyproject.toml:213-246` — Script entry points\n\n### Data Flow Architecture\n\nThe epub scraper would follow the same three-step pipeline as Word/PDF:\n\n1. **Extract** — Parse `.epub` file → sections with text, headings, code, images → save to `output/{name}_extracted.json`\n2. **Categorize** — Group sections by chapters/keywords\n3. **Build** — Generate `SKILL.md`, `references/*.md`, `references/index.md`, `assets/`\n\nThe intermediate JSON format uses the same structure as Word/PDF:\n```python\n{\n    \"source_file\": str,\n    \"metadata\": {\"title\", \"author\", \"created\", ...},\n    \"total_sections\": int,\n    \"total_code_blocks\": int,\n    \"total_images\": int,\n    \"languages_detected\": {str: int},\n    \"pages\": [  # sections\n        {\n            \"section_number\": int,\n            \"heading\": str,\n            \"text\": str,\n            \"code_samples\": [...],\n            \"images\": [...],\n            \"headings\": [...]\n        }\n    ]\n}\n```\n\n## Architecture Documentation\n\n### Document Input Format Pattern\n\nEach input format follows a consistent architecture:\n\n```\n[source_detector.py] → detect type by extension\n        ↓\n[create_command.py] → route to scraper\n        ↓\n[{format}_scraper.py] → extract → categorize → build skill\n        ↓\n[output/{name}/] → SKILL.md + references/ + assets/\n```\n\nSupporting files per format:\n- `arguments/{format}.py` — CLI argument definitions\n- `parsers/{format}_parser.py` — Subcommand parser class\n- `tests/test_{format}_scraper.py` — Test suite\n\n### Dependency Guard Pattern\n\nThe Word scraper uses an optional dependency guard that epub should replicate:\n\n```python\ntry:\n    import ebooklib\n    from ebooklib import epub\n    EPUB_AVAILABLE = True\nexcept ImportError:\n    EPUB_AVAILABLE = False\n\ndef _check_epub_deps():\n    if not EPUB_AVAILABLE:\n        raise RuntimeError(\n            \"ebooklib is required for EPUB support.\\n\"\n            'Install with: pip install \"skill-seekers[epub]\"\\n'\n            \"Or: pip install ebooklib\"\n        )\n```\n\n## Summary Table\n\n| Category | Files | Action |\n|----------|-------|--------|\n| New files | 4 | Create from scratch |\n| Source detection | 1 | Add epub detection + validation |\n| CLI dispatcher | 1 | Add command module mapping |\n| Create command | 1 | Add routing + help + examples |\n| Arguments | 1 | Add EPUB_ARGUMENTS + register in helpers |\n| Parser registry | 1 | Import + register EpubParser |\n| Package config | 1 | Add deps + entry point |\n| Documentation | 2+ | Update CLAUDE.md, CHANGELOG |\n| **Total** | **12+ modified, 4 new** | |\n\n## Open Questions\n\n- Should epub support reuse any of the existing HTML parsing from `word_scraper.py` (which uses mammoth to convert to HTML then parses with BeautifulSoup)? EPUB internally contains XHTML files, so BeautifulSoup parsing would be directly applicable.\n- Should the epub scraper support DRM-protected files, or only DRM-free epub files?\n- Should epub-specific arguments include options like `--chapter-range` (similar to PDF's `--pages`)?\n","frontmatter":{"date":"2026-03-14T12:54:24.700367+00:00","git_commit":"7c90a4b9c9bccac8341b0769550d77aae3b4e524","branch":"development","topic":"What files would be affected to add .epub support for input","tags":["research","codebase","epub","input-format","scraper"],"status":"complete"},"isInternal":false,"tokens":2734,"sizeBytes":10318},{"name":"create-skill.md","path":"distribution/claude-plugin/commands/create-skill.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/distribution/claude-plugin/commands/create-skill.md","title":"Command: /create-skill","category":"command-prompt","format":"markdown","content":"---\ndescription: Create an AI skill from any source (URL, repo, PDF, video, notebook, etc.)\n---\n\n# Create Skill\n\nCreate an AI-ready skill from a source. The source type is auto-detected.\n\n## Usage\n\n```\n/skill-seekers:create-skill <source> [--preset <level>] [--output <dir>]\n```\n\n## Instructions\n\nWhen the user provides a source via `$ARGUMENTS`, run the `skill-seekers create` command to generate a skill.\n\n1. Parse the arguments: extract the source (first argument) and any flags.\n2. If no `--preset` is specified, default to `quick` for fast results.\n3. If no `--output` is specified, default to `./output`.\n4. Run the create command:\n   ```bash\n   skill-seekers create \"$SOURCE\" --preset quick --output \"$OUTPUT\"\n   ```\n5. After completion, read the generated `SKILL.md` and summarize what was created.\n6. If the user wants to target a specific platform (e.g., Claude, OpenAI, LangChain), run the package command after:\n   ```bash\n   skill-seekers package \"$SKILL_DIR\" --target \"$PLATFORM\"\n   ```\n\n## Presets\n\n- `-p quick` — 1-2 minutes, basic skill\n- `-p standard` — 5-10 minutes, good coverage\n- `-p comprehensive` — 20-60 minutes, full analysis\n\n## Source Types (auto-detected)\n\n- **URL** (https://...) — Documentation scraping\n- **owner/repo** or github.com URL — GitHub repo analysis\n- **file.pdf** — PDF extraction\n- **file.ipynb** — Jupyter notebook\n- **file.docx** — Word document\n- **file.epub** — EPUB book\n- **YouTube/Vimeo URL** — Video transcript\n- **./directory** — Local codebase analysis\n- **file.yaml** with OpenAPI — API spec\n- **file.pptx** — PowerPoint\n- **file.adoc** — AsciiDoc\n- **file.html** — HTML page\n- **file.rss** — RSS/Atom feed\n- **cmd.1** — Man page\n\n## Examples\n\n```\n/skill-seekers:create-skill https://react.dev\n/skill-seekers:create-skill pallets/flask -p standard\n/skill-seekers:create-skill ./docs/api.pdf\n/skill-seekers:create-skill https://youtube.com/watch?v=abc123\n```\n","frontmatter":{"description":"Create an AI skill from any source (URL, repo, PDF, video, notebook, etc.)"},"isInternal":false,"tokens":538,"sizeBytes":1948},{"name":"install-skill.md","path":"distribution/claude-plugin/commands/install-skill.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/distribution/claude-plugin/commands/install-skill.md","title":"Command: /install-skill","category":"command-prompt","format":"markdown","content":"---\ndescription: One-command skill creation and packaging for a target platform\n---\n\n# Install Skill\n\nEnd-to-end workflow: create a skill from any source, then package it for a target LLM platform.\n\n## Usage\n\n```\n/skill-seekers:install-skill <source> [--target <platform>] [--preset <level>]\n```\n\n## Instructions\n\nWhen the user provides a source via `$ARGUMENTS`:\n\n1. Parse the arguments: extract source, `--target` (default: claude), `--preset` (default: quick).\n2. Run the create command:\n   ```bash\n   skill-seekers create \"$SOURCE\" --preset \"$PRESET\" --output ./output\n   ```\n3. Find the generated skill directory (look for the directory containing SKILL.md in ./output/).\n4. Run the package command for the target platform:\n   ```bash\n   skill-seekers package \"$SKILL_DIR\" --target \"$TARGET\"\n   ```\n5. Report what was created and where to find the packaged output.\n\n## Target Platforms\n\n`claude` (default), `openai`, `gemini`, `langchain`, `llama-index`, `haystack`, `markdown`, `chroma`, `weaviate`, `faiss`, `qdrant`, `pinecone`, `deepseek`, `kimi`, `qwen`, `fireworks`, `openrouter`, `together`, `minimax`, `opencode`, `ibm-bob`\n\n> **IDE-specific installs** (`cursor`, `windsurf`, `continue`, `cline`) are not standalone `--target` values. Use `skill-seekers install-agent` or manually copy the output from `--target markdown` or `--target claude`.\n\n## Examples\n\n```\n/skill-seekers:install-skill https://react.dev --target claude\n/skill-seekers:install-skill pallets/flask --target langchain -p standard\n/skill-seekers:install-skill ./docs/api.pdf --target openai\n```\n","frontmatter":{"description":"One-command skill creation and packaging for a target platform"},"isInternal":false,"tokens":431,"sizeBytes":1576},{"name":"ARCHITECTURE.md","path":"docs/ARCHITECTURE.md","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/docs/ARCHITECTURE.md","title":"docs - System Architecture & Module Boundaries","category":"project-spec","format":"markdown","content":"# Documentation Architecture\n\n> **How Skill Seekers documentation is organized (v3.6.0 - 18 source types)**\n\n---\n\n## Philosophy\n\nOur documentation follows these principles:\n\n1. **Progressive Disclosure** - Start simple, add complexity as needed\n2. **Task-Oriented** - Organized by what users want to do\n3. **Single Source of Truth** - One authoritative reference per topic\n4. **Version Current** - Always reflect the latest release\n\n---\n\n## Directory Structure\n\n```\ndocs/\n├── README.md              # Entry point - navigation hub\n├── ARCHITECTURE.md        # This file\n│\n├── getting-started/       # New users (lowest cognitive load)\n│   ├── 01-installation.md\n│   ├── 02-quick-start.md\n│   ├── 03-your-first-skill.md\n│   └── 04-next-steps.md\n│\n├── user-guide/            # Common tasks (practical focus)\n│   ├── 01-core-concepts.md\n│   ├── 02-scraping.md\n│   ├── 03-enhancement.md\n│   ├── 04-packaging.md\n│   ├── 05-workflows.md\n│   └── 06-troubleshooting.md\n│\n├── reference/             # Technical details (comprehensive)\n│   ├── CLI_REFERENCE.md\n│   ├── MCP_REFERENCE.md\n│   ├── CONFIG_FORMAT.md\n│   └── ENVIRONMENT_VARIABLES.md\n│\n└── advanced/              # Power users (specialized)\n    ├── mcp-server.md\n    ├── mcp-tools.md\n    ├── custom-workflows.md\n    └── multi-source.md\n```\n\n---\n\n## Category Guidelines\n\n### Getting Started\n\n**Purpose:** Get new users to their first success quickly\n\n**Characteristics:**\n- Minimal prerequisites\n- Step-by-step instructions\n- Copy-paste ready commands\n- Screenshots/output examples\n\n**Files:**\n- `01-installation.md` - Install the tool\n- `02-quick-start.md` - 3 commands to first skill\n- `03-your-first-skill.md` - Complete walkthrough\n- `04-next-steps.md` - Where to go after first success\n\n---\n\n### User Guide\n\n**Purpose:** Teach common tasks and concepts\n\n**Characteristics:**\n- Task-oriented\n- Practical examples\n- Best practices\n- Common patterns\n\n**Files:**\n- `01-core-concepts.md` - How it works\n- `02-scraping.md` - All 18 source types (docs, GitHub, PDF, video, Word, EPUB, Jupyter, HTML, OpenAPI, AsciiDoc, PPTX, RSS, man pages, Confluence, Notion, Slack/Discord, local codebase)\n- `03-enhancement.md` - AI enhancement\n- `04-packaging.md` - Platform export\n- `05-workflows.md` - Workflow presets\n- `06-troubleshooting.md` - Problem solving\n\n---\n\n### Reference\n\n**Purpose:** Authoritative technical information\n\n**Characteristics:**\n- Comprehensive\n- Precise\n- Organized for lookup\n- Always accurate\n\n**Files:**\n- `CLI_REFERENCE.md` - All CLI commands (including 17 source-type subcommands)\n- `MCP_REFERENCE.md` - 40 MCP tools\n- `CONFIG_FORMAT.md` - JSON schema (covers all 18 source types)\n- `ENVIRONMENT_VARIABLES.md` - All env vars (including Confluence, Notion, Slack tokens)\n\n---\n\n### Advanced\n\n**Purpose:** Specialized topics for power users\n\n**Characteristics:**\n- Assumes basic knowledge\n- Deep dives\n- Complex scenarios\n- Integration topics\n\n**Files:**\n- `mcp-server.md` - MCP server setup\n- `mcp-tools.md` - Advanced MCP usage\n- `custom-workflows.md` - Creating workflows\n- `multi-source.md` - Unified scraping\n\n---\n\n## Naming Conventions\n\n### Files\n\n- **getting-started:** `01-topic.md` (numbered for order)\n- **user-guide:** `01-topic.md` (numbered for order)\n- **reference:** `TOPIC_REFERENCE.md` (uppercase, descriptive)\n- **advanced:** `topic.md` (lowercase, specific)\n\n### Headers\n\n- H1: Title with version\n- H2: Major sections\n- H3: Subsections\n- H4: Details\n\nExample:\n```markdown\n# Topic Guide\n\n> **Skill Seekers v3.9.0**\n\n## Major Section\n\n### Subsection\n\n#### Detail\n```\n\n---\n\n## Cross-References\n\nLink to related docs using relative paths:\n\n```markdown\n<!-- Within same directory -->\nSee [Troubleshooting](user-guide/06-troubleshooting.md)\n\n<!-- Up one directory, then into reference -->\nSee [CLI Reference](reference/CLI_REFERENCE.md)\n\n<!-- Up two directories (to root) -->\nSee [Contributing](../CONTRIBUTING.md)\n```\n\n---\n\n## Maintenance\n\n### Keeping Docs Current\n\n1. **Update with code changes** - Docs must match implementation\n2. **Version in header** - Keep version current\n3. **Last updated date** - Track freshness\n4. **Deprecate old files** - Don't delete, redirect\n\n### Review Checklist\n\nBefore committing docs:\n\n- [ ] Commands actually work (tested)\n- [ ] No phantom commands documented\n- [ ] Links work\n- [ ] Version number correct\n- [ ] Date updated\n\n---\n\n## Adding New Documentation\n\n### New User Guide\n\n1. Add to `user-guide/` with next number\n2. Update `docs/README.md` navigation\n3. Add to table of contents\n4. Link from related guides\n\n### New Reference\n\n1. Add to `reference/` with `_REFERENCE` suffix\n2. Update `docs/README.md` navigation\n3. Link from user guides\n4. Add to troubleshooting if relevant\n\n### New Advanced Topic\n\n1. Add to `advanced/` with descriptive name\n2. Update `docs/README.md` navigation\n3. Link from appropriate user guide\n\n---\n\n## Deprecation Strategy\n\nWhen content becomes outdated:\n\n1. **Don't delete immediately** - Breaks external links\n2. **Add deprecation notice**:\n   ```markdown\n   > ⚠️ **DEPRECATED**: This document is outdated.\n   > See [New Guide](path/to/new.md) for current information.\n   ```\n3. **Move to archive** after 6 months:\n   ```\n   docs/archive/legacy/\n   ```\n4. **Update navigation** to remove deprecated links\n\n---\n\n## Contributing\n\n### Doc Changes\n\n1. Edit relevant file\n2. Test all commands\n3. Update version/date\n4. Submit PR\n\n### New Doc\n\n1. Choose appropriate category\n2. Follow naming conventions\n3. Add to README.md\n4. Cross-link related docs\n\n---\n\n## See Also\n\n- [Docs README](README.md) - Navigation hub\n- [Contributing Guide](../CONTRIBUTING.md) - How to contribute\n- [Repository README](../README.md) - Project overview\n","isInternal":false,"tokens":1496,"sizeBytes":5861},{"name":"plugin.json","path":".codex-plugin/plugin.json","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/.codex-plugin/plugin.json","title":"skill-seekers","category":"plugin-manifest","format":"json","content":"{\n  \"name\": \"skill-seekers\",\n  \"version\": \"3.5.0\",\n  \"description\": \"Convert docs and repos into AI skills via MCP\",\n  \"author\": {\n    \"name\": \"yusufkaraaslan\",\n    \"url\": \"https://github.com/yusufkaraaslan/Skill_Seekers\"\n  },\n  \"homepage\": \"https://skillseekersweb.com/\",\n  \"repository\": \"https://github.com/yusufkaraaslan/Skill_Seekers\",\n  \"keywords\": [\"mcp\", \"codex\", \"skills\", \"documentation\"],\n  \"mcpServers\": \"./.mcp.json\",\n  \"skills\": \"./skills/\",\n  \"interface\": {\n    \"displayName\": \"Skill Seekers\",\n    \"shortDescription\": \"Convert docs and repos into AI skills via MCP\",\n    \"longDescription\": \"Convert documentation websites, GitHub repositories, and PDFs into AI skills with automatic conflict detection.\",\n    \"category\": \"Development\",\n    \"websiteURL\": \"https://skillseekersweb.com/\"\n  }\n}\n","frontmatter":{"name":"skill-seekers","version":"3.5.0","description":"Convert docs and repos into AI skills via MCP","author":{"name":"yusufkaraaslan","url":"https://github.com/yusufkaraaslan/Skill_Seekers"},"homepage":"https://skillseekersweb.com/","repository":"https://github.com/yusufkaraaslan/Skill_Seekers","keywords":["mcp","codex","skills","documentation"],"mcpServers":"./.mcp.json","skills":"./skills/","interface":{"displayName":"Skill Seekers","shortDescription":"Convert docs and repos into AI skills via MCP","longDescription":"Convert documentation websites, GitHub repositories, and PDFs into AI skills with automatic conflict detection.","category":"Development","websiteURL":"https://skillseekersweb.com/"}},"isInternal":false,"tokens":229,"sizeBytes":805},{"name":"plugin.json","path":"distribution/claude-plugin/.claude-plugin/plugin.json","rawUrl":"https://raw.githubusercontent.com/yusufkaraaslan/Skill_Seekers/HEAD/distribution/claude-plugin/.claude-plugin/plugin.json","title":"skill-seekers","category":"plugin-manifest","format":"json","content":"{\n  \"name\": \"skill-seekers\",\n  \"description\": \"Transform 18 source types (docs, GitHub, PDFs, videos, Jupyter, Confluence, Notion, Slack, and more) into AI-ready skills and RAG knowledge for 21+ AI platforms.\",\n  \"version\": \"3.9.1\",\n  \"author\": {\n    \"name\": \"Yusuf Karaaslan\"\n  },\n  \"homepage\": \"https://github.com/yusufkaraaslan/Skill_Seekers\",\n  \"repository\": \"https://github.com/yusufkaraaslan/Skill_Seekers\",\n  \"license\": \"MIT\"\n}\n","frontmatter":{"name":"skill-seekers","description":"Transform 18 source types (docs, GitHub, PDFs, videos, Jupyter, Confluence, Notion, Slack, and more) into AI-ready skills and RAG knowledge for 21+ AI platforms.","version":"3.9.1","author":{"name":"Yusuf Karaaslan"},"homepage":"https://github.com/yusufkaraaslan/Skill_Seekers","repository":"https://github.com/yusufkaraaslan/Skill_Seekers","license":"MIT"},"isInternal":false,"tokens":142,"sizeBytes":435}],"systemPromptSnippet":"<yakaai_skills repo=\"yusufkaraaslan/Skill_Seekers\">\n<!-- File: AGENTS.md (Tokens: ~3876 | Category: root-instruction) -->\n# AGENTS.md - Skill Seekers\n\nComprehensive 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.\n\n## Project Overview\n\n**Skill Seekers** is a universal preprocessing layer that transforms raw documentation and code into structured knowledge assets. It supports 17+ source types and exports to 21+ AI platforms including Claude, Gemini, OpenAI, LangChain, LlamaIndex, and various vector databases.\n\n### Key Capabilities\n- **Source Types (17):** Documentation websites, GitHub repos, PDFs, Word docs, EPUBs, videos, local codebases, Jupyter notebooks, HTML, OpenAPI specs, AsciiDoc, PowerPoint, Confluence, Notion, RSS feeds, man pages, chat exports\n- **Export Targets (21):** Claude, Gemini, OpenAI, MiniMax, OpenCode, Kimi, DeepSeek, Qwen, OpenRouter, Together AI, Fireworks AI, Markdown, LangChain, LlamaIndex, Haystack, Weaviate, ChromaDB, FAISS, Qdrant, Pinecone\n- **MCP Server:** FastMCP-based Model Context Protocol server for AI assistant integration\n\n## Setup\n\n```bash\n# REQUIRED before running tests (src/ layout — tests hard-exit if package not installed)\npip install -e .\n\n# With dev tools (pytest, ruff, mypy, coverage)\npip install -e \".[dev]\"\n\n# With specific LLM platform support\npip install -e \".[gemini]\"      # Google Gemini\npip install -e \".[openai]\"      # OpenAI ChatGPT\npip install -e \".[all-llms]\"    # All LLM platforms\n\n# With all optional dependencies (except video-full)\npip install -e \".[all]\"\n\n# Full video processing (heavy dependencies)\npip install -e \".[video-full]\"\n```\n\nNote: `tests/conftest.py` checks that `skill_seekers` is importable and calls `sys.exit(1)` if not. Always install in editable mode first.\n\n### Environment Variables\n\nCreate a `.env` file or export these variables:\n```bash\nANTHROPIC_API_KEY      # For Claude AI enhancement\nGOOGLE_API_KEY         # For Gemini support\nOPENAI_API_KEY         # For OpenAI support\nGITHUB_TOKEN           # For GitHub repo scraping (higher rate limits)\n```\n\n## Build / Test / Lint\n\n```bash\n# Full suite (never skip — all must pass)\npytest tests/ -v\n\n# Fast iteration (skip slow, integration, E2E, network, MCP)\npytest tests/ -m \"not slow and not integration and not e2e and not network and not serial and not mcp_only\" -q\n\n# Fast parallel (install pytest-xdist first)\npytest 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\n\n# 3-phase runner script (recommended for local dev)\nbash scripts/run_tests_fast.sh\n\n# Single test\npytest tests/test_scraper_features.py::test_detect_language -v\n\n# Skip slow/integration\npytest tests/ -v -m \"not slow and not integration\"\n\n# With coverage\npytest tests/ --cov=src/skill_seekers --cov-report=term\n\n# Lint + format check (matches CI)\nruff check src/ tests/\nruff format --check src/ tests/\n\n# Type check (non-blocking — mypy is continue-on-error in CI)\nmypy src/skill_seekers --show-error-codes --pretty\n```\n\n**Pytest config:** `asyncio_mode = \"auto\"`, so `@pytest.mark.asyncio` is implicit. Test markers: `slow`, `integration`, `e2e`, `venv`, `bootstrap`, `benchmark`, `asyncio`, `serial`, `network`, `mcp_only`.\n\n**CI note:** CI pins `ruff==0.15.8` (not the `>=0.14.13` dev dep). If formatting behaves differently locally, check the CI version.\n\n**CI test phases:** Tests are split into 3 parallel jobs:\n- `test-fast` — 3386 unit tests with xdist across OS/Python matrix\n- `test-serial` — 69 serial/integration/E2E/network tests\n- `test-mcp` — 193 MCP tests (requires `[mcp]` extras)\n\n## Code Style\n\n### Formatting Rules (ruff — from pyproject.toml)\n- **Line length:** 100 characters\n- **Target Python:** 3.10+\n- **Enabled lint rules:** E, W, F, I, B, C4, UP, ARG, SIM\n- **Ignored rules:** E501 (line length handled by formatter), F541 (f-string style), ARG002 (unused method args for interface compliance), B007 (intentional unused loop vars), I001 (formatter handles imports), SIM114 (readability preference)\n\n### Imports\n- Sort with isort (via ruff); `skill_seekers` is first-party\n- Standard library → third-party → first-party, separated by blank lines\n- Use `from __future__ import annotations` only if needed for forward refs\n- Guard optional imports with try/except ImportError (see `adaptors/__init__.py` pattern):\n  ```python\n  try:\n      from .claude import ClaudeAdaptor\n      from .minimax import MiniMaxAdaptor\n  except ImportError:\n      ClaudeAdaptor = None\n      MiniMaxAdaptor = None\n  ```\n\n### Naming Conventions\n- **Files:** `snake_case.py` (e.g., `source_detector.py`, `config_validator.py`)\n- **Classes:** `PascalCase` (e.g., `SkillAdaptor`, `ClaudeAdaptor`, `SourceDetector`)\n- **Functions/methods:** `snake_case` (e.g., `get_adaptor()`, `detect_language()`)\n- **Constants:** `UPPER_CASE` (e.g., `ADAPTORS`, `DEFAULT_CHUNK_TOKENS`, `VALID_SOURCE_TYPES`)\n- **Private:** prefix with `_` (e.g., `_read_existing_content()`, `_validate_unified()`)\n\n### Type Hints\n- Gradual typing — add hints where practical, not enforced everywhere\n- Use modern syntax: `str | None` not `Optional[str]`, `list[str]` not `List[str]`\n- MyPy config: `disallow_untyped_defs = false`, `check_untyped_defs = true`, `ignore_missing_imports = true`\n- Tests are excluded from strict type checking (`disallow_untyped_defs = false`, `check_untyped_defs = false` for `tests.*`)\n\n### Docstrings\n- Module-level docstring on every file (triple-quoted, describes purpose)\n- Google-style docstrings for public functions/classes\n- Include `Args:`, `Returns:`, `Raises:` sections where useful\n\n### Error Handling\n- Use specific exceptions, never bare `except:`\n- Provide helpful error messages with context\n- Use `raise ValueError(...)` for invalid arguments, `raise RuntimeError(...)` for state errors\n- Guard optional dependency imports with try/except and give clear install instructions on failure\n- Chain exceptions with `raise ... from e` when wrapping\n\n### Suppressing Lint Warnings\n- Use inline `# noqa: XXXX` comments (e.g., `# noqa: F401` for re-exports, `# noqa: ARG001` for required but unused params)\n\n## Project Layout\n\n```\nsrc/skill_seekers/           # Main package (src/ layout)\n  cli/                       # CLI commands and entry points (100+ files)\n    adaptors/                # Platform adaptors (Strategy pattern, inherit SkillAdaptor)\n    arguments/               # CLI argument definitions (one per source type)\n    parsers/                 # Subcommand parsers (one per source type)\n    storage/                 # Cloud storage (inherit BaseStorageAdaptor)\n    main.py                  # Unified CLI entry point (COMMAND_MODULES dict)\n    source_detector.py       # Auto-detects source type from user input\n    create_command.py        # Unified `create` command routing\n    config_validator.py      # VALID_SOURCE_TYPES set + per-type validation\n    unified_scraper.py       # Multi-source orchestrator (scraped_data + dispatch)\n    unified_skill_builder.py # Pairwise synthesis + generic merge\n  mcp/                       # MCP server (FastMCP + legacy)\n    tools/                   # MCP tool implementations by category (10 files)\n    server_fastmcp.py        # FastMCP server implementation\n    server_legacy.py         # Legacy MCP server\n  sync/                      # Sync monitoring (Pydantic models)\n  benchmark/                 # Benchmarking framework\n  embedding/                 # FastAPI embedding server\n  workflows/                 # 67 YAML workflow presets\n  _version.py                # Reads version from pyproject.toml\ntests/                       # 160 test files (pytest)\n  test_adaptors/             # 22 adaptor-specific test files\n  conftest.py                # Test configuration with package check\nconfigs/                     # Preset JSON scraping configs\ndocs/                        # Documentation (guides, integrations, architecture)\n```\n\n## Key Patterns\n\n**Adaptor (Strategy) pattern** — all platform logic in `cli/adaptors/`. Inherit `SkillAdaptor`, implement `format_skill_md()`, `package()`, `upload()`. Register in `adaptors/__init__.py` ADAPTORS dict.\n\n**Scraper pattern** — each source type has: `cli/<type>_scraper.py` (with `<Type>ToSkillConverter` class + `main()`), `arguments/<type>.py`, `parsers/<type>_parser.py`. Register in `parsers/__init__.py` PARSERS list, `main.py` COMMAND_MODULES dict, `config_validator.py` VALID_SOURCE_TYPES set.\n\n**Unified pipeline** — `unified_scraper.py` dispatches to per-type `_scrape_<type>()` methods. `unified_skill_builder.py` uses pairwise synthesis for docs+github+pdf combos and `_generic_merge()` for all other combinations.\n\n**MCP tools** — grouped in `mcp/tools/` by category. `scrape_generic_tool` handles all new source types.\n\n**CLI subcommands** — git-style in `cli/main.py`. Each delegates to a module's `main()` function.\n\n**Supported source types (17):** documentation (web), github, pdf, local, word, video, epub, jupyter, html, openapi, asciidoc, pptx, confluence, notion, rss, manpage, chat. Each detected automatically by `source_detector.py`.\n\n**Supported platforms (21):** claude, gemini, openai, minimax, opencode, kimi, deepseek, qwen, openrouter, together, fireworks, markdown, langchain, llama-index, haystack, weaviate, chroma, faiss, qdrant, pinecone.\n\n## Web UI (Seeker HUD) — beta\n\n**Status: beta** (since 3.10.0). Screens, API routes and `~/.skill-seekers/ui/` state may change between minor releases; the CLI and MCP server are unaffected.\n\nLocal web app: React 19 + Vite + Tailwind/shadcn frontend in `ui/`, FastAPI backend in `src/skill_seekers/web/`.\n\n```bash\n# Run the app (opens browser; API on :8770)\nskill-seekers ui\n\n# Frontend dev mode (hot reload, proxies /api to :8770)\ncd ui && npm install && npm run dev\n\n# Build frontend (Vite outputs to src/skill_seekers/web/dist, which the\n# backend serves and the wheel bundles as package-data)\ncd ui && npm run build\n```\n\n- Backend deps: `pip install -e \".[ui]\"` (fastapi + uvicorn; also in `[all]` and dev group)\n- **Packaging:** the built SPA is bundled into the wheel from `src/skill_seekers/web/dist` (gitignored; the release workflow runs `npm run build` before `uv build`). `skill-seekers ui` warns if the frontend hasn't been built.\n- Jobs run as subprocesses (`python -m skill_seekers.web.runner`) with streamed logs + `[[PROGRESS:nn]]` markers\n- UI state: `~/.skill-seekers/ui/` (jobs, projects, activity, skill overrides, settings)\n- API tests: `tests/test_web_api.py`\n\n## CLI Commands\n\n```bash\n# Core commands\nskill-seekers create <source>              # Create skill from any source (auto-detects type)\nskill-seekers create <source> --index      # ...plus an opt-in SQLite search index + scripts/search.py\nskill-seekers scan <dir>                   # AI-detect a project's tech stack and emit per-framework configs\nskill-seekers enhance <directory>          # AI-powered enhancement\nskill-seekers package <directory>          # Package skill for target platform\nskill-seekers upload <file>                # Upload skill to target platform\nskill-seekers install <source>             # One-command workflow (scrape + enhance + package + upload)\n\n# Utilities\nskill-seekers estimate <source>            # Estimate page count before scraping\nskill-seekers detect <source> [--json]     # Read-only: how create would classify a source (exit 2 if invalid)\nskill-seekers doctor [--json]              # Health check for dependencies (--json for CI/agents)\nskill-seekers config                       # Configure API keys and settings\nskill-seekers workflows                    # List and apply workflow presets\nskill-seekers resume <job_id>              # Resume interrupted scraping\n\n# Advanced\nskill-seekers stream <source>              # Streaming ingestion\nskill-seekers update <directory>           # Incremental update\nskill-seekers multilang <directory>        # Multi-language support\n```\n\n## Testing Instructions\n\n### Test Structure\n- Unit tests: `tests/test_*.py` — test individual modules\n- Adaptor tests: `tests/test_adaptors/test_*_adaptor.py` — test platform adaptors\n- E2E tests: `tests/test_*_e2e.py` — end-to-end integration tests\n\n### Running Tests\n```bash\n# Fast test run (skip slow/integration tests)\npytest tests/ -v -m \"not slow and not integration\"\n\n# Full test suite\npytest tests/ -v\n\n# With coverage report\npytest tests/ --cov=src/skill_seekers --cov-report=term-missing\n\n# Specific test categories\npytest tests/ -v -m \"slow\"           # Only slow tests\npytest tests/ -v -m \"integration\"    # Only integration tests\npytest tests/ -v -m \"e2e\"            # Only E2E tests\n```\n\n### Test Fixtures\nTest fixtures are located in `tests/fixtures/` and include sample configs, HTML files, and mock data.\n\n## Git Workflow\n\n- **`main`** — production, protected\n- **`development`** — default PR target, active dev\n- Feature branches created from `development`\n\n## Pre-commit Checklist\n\n```bash\nruff check src/ tests/\nruff format --check src/ tests/\npytest tests/ -v -x   # stop on first failure\n```\n\nNever commit API keys. Use env vars: `ANTHROPIC_API_KEY`, `GOOGLE_API_KEY`, `OPENAI_API_KEY`, `GITHUB_TOKEN`.\n\n## CI/CD\n\nGitHub Actions (7 workflows in `.github/workflows/`):\n- **tests.yml** — ruff + mypy lint job, then pytest matrix (Ubuntu + macOS, Python 3.10-3.12) with Codecov upload\n- **release.yml** — tag-triggered: tests → version verification → PyPI publish via `uv build`\n- **test-vector-dbs.yml** — tests vector DB adaptors (weaviate, chroma, faiss, qdrant)\n- **docker-publish.yml** — multi-platform Docker builds (amd64, arm64) for CLI + MCP images\n- **quality-metrics.yml** — quality analysis with configurable threshold\n- **scheduled-updates.yml** — weekly skill updates for popular frameworks\n- **vector-db-export.yml** — weekly vector DB exports\n\n## Deployment\n\n### Docker\nMulti-stage Dockerfile with Python 3.12 slim base:\n```bash\n# Build CLI image\ndocker build -t skill-seekers:local -f Dockerfile .\n\n# Run CLI\ndocker run -v $(pwd)/output:/output skill-seekers:local create https://docs.example.com\n\n# Run MCP server\ndocker build -t skill-seekers-mcp:local -f Dockerfile.mcp .\ndocker run -p 8765:8765 skill-seekers-mcp:local\n```\n\n### MCP Server\nThe MCP server provides Model Context Protocol integration:\n```bash\n# Start FastMCP server\nskill-seekers-mcp\n\n# Or use the Python module\npython -m skill_seekers.mcp.server_fastmcp\n```\n\n## Security Considerations\n\n- **API Keys:** Never commit API keys to version control. Use environment variables or `.env` files (already in `.gitignore`)\n- **Docker:** Runs as non-root user (`skillseeker`, UID 1000)\n- **Dependencies:** Regular security updates via `pip audit` or `safety check`\n- **Sandboxing:** Video processing uses optional dependencies that can be heavy; install `[video-full]` only when needed\n\n## Additional Resources\n\n- **Website:** https://skillseekersweb.com/\n- **Documentation:** https://skillseekersweb.com/\n- **PyPI:** https://pypi.org/project/skill-seekers/\n- **Repository:** https://github.com/yusufkaraaslan/Skill_Seekers\n- **Config Browser:** https://skillseekersweb.com/\n- **Project Board:** https://github.com/users/yusufkaraaslan/projects/2\n\n<!-- File: CLAUDE.md (Tokens: ~5550 | Category: claude-rule) -->\n# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\n**Skill Seekers** converts documentation from 18 source types into production-ready formats for 21+ AI platforms (LLM platforms, RAG frameworks, vector databases, AI coding assistants). Published on PyPI as `skill-seekers`.\n\n**Version:** 3.11.0 (dev; last release 3.10.0) — source of truth is `src/skill_seekers/_version.py` | **Python:** 3.10+ | **Website:** https://skillseekersweb.com/\n\n**Architecture:** See `docs/UML_ARCHITECTURE.md` for UML diagrams and module overview. StarUML project at `docs/UML/skill_seekers.mdj`. Refactor state/history: `docs/UNIFICATION_PLAN.md` (Grand Unification — all 5 phases done; remaining cosmetic items listed there).\n\n## Essential Commands\n\n```bash\n# REQUIRED before running tests or CLI (src/ layout)\npip install -e .\n\n# Run all tests (NEVER skip - all must pass before commits)\npytest tests/ -v\n\n# Fast iteration (skip slow MCP tests ~20min)\npytest tests/ --ignore=tests/test_mcp_fastmcp.py --ignore=tests/test_mcp_server.py --ignore=tests/test_install_skill_e2e.py -q\n\n# Single test\npytest tests/test_scraper_features.py::test_detect_language -vv -s\n\n# Code quality (must pass before push - matches CI)\nuvx ruff check src/ tests/\nuvx ruff format --check src/ tests/\nmypy src/skill_seekers  # continue-on-error in CI\n\n# Auto-fix lint/format issues\nuvx ruff check --fix --unsafe-fixes src/ tests/\nuvx ruff format src/ tests/\n\n# Build & publish\nuv build\nuv publish\n```\n\n## CI Matrix\n\nRuns on push/PR to `main` or `development`. Lint job (Python 3.12, Ubuntu) + Test job (Ubuntu + macOS, Python 3.10/3.11/3.12, excludes macOS+3.10). Both must pass for merge.\n\n## Git Workflow\n\n- **Main branch:** `main` (requires tests + 1 review)\n- **Development branch:** `development` (default PR target, requires tests)\n- **Feature branches:** `feature/{task-id}-{description}` from `development`\n- PRs always target `development`, never `main` directly\n\n## Architecture\n\n### CLI: Unified create command\n\nEntry point `src/skill_seekers/cli/main.py`. The `create` command is the **primary** entry point for skill creation — it auto-detects source type and routes to the appropriate `SkillConverter`. The `scan` command (added in #327) is a separate discovery step for projects with multiple frameworks; it emits one config file per detected framework and you then run `create` on each.\n\n```\nskill-seekers create <source>     # Auto-detect: URL, owner/repo, ./path, file.pdf, etc.\nskill-seekers scan <dir>          # AI-driven discovery → emits one config per detected framework + <project>-codebase.json\nskill-seekers package <dir>       # Package for platform (--target claude/gemini/openai/markdown/minimax/opencode/kimi/deepseek/qwen/openrouter/together/fireworks/atlas/langchain/llama-index/haystack/chroma/faiss/weaviate/qdrant/pinecone/ibm-bob)\n```\n\n### Scan command (issue #327)\n\n`skill-seekers scan <dir>` is an AI-driven project knowledge-base bootstrapper. Pipeline in `src/skill_seekers/cli/scan_command.py`:\n\n1. `collect_signals()` in `signal_collectors.py` — deterministic, bounded gathering of manifests + README + Dockerfile/CI + sampled source files + git remote. **Per-kind byte budgets** (24 KB manifest / 6 KB README / 6 KB CI / 28 KB samples, total 64 KB) so a fat package.json can't crowd out other kinds. `_SOURCE_DIRS` covers ~14 layouts (Go `cmd/`, Rust `crates/`, JS monorepo `apps/packages/`, Maven `source/`, Django at root); also walks root one level deep for flat-layout Python.\n2. `detect_with_ai(bundle, AgentClient)` — one LLM call, structured JSON output. **Source signals are first-2-KB of each file** (whole-file sampling, no regex parsing — added in WS4 because regex missed Go multi-line imports + Rust `mod`/`extern crate`). Canonical-slug prompt + the canonical-name resolver are coupled — change one, update the other.\n3. `resolve_or_generate_with_status()` — for each detection: try `out_dir/<slug>.json` (cache from prior run), then `resolve_config_path` from `config_fetcher` with multiple canonical name candidates (`_canonical_name_candidates` handles `\"Godot Engine\"` → `\"godot\"`, plus CJK / European suffixes like `\"Godot 引擎\"`, `\"React フレームワーク\"`, `\"Lodash Bibliothek\"`), then `generate_config_with_ai` as the last resort. Always appends `.json` to lookup names so local-disk and user-dir resolution actually finds files. Always stamps `metadata.detected_version` (nested, not top-level — `metadata.version` already exists and means config-schema version).\n4. `emit_codebase_config()` — always writes `<project>-codebase.json` (a `type: local` source pointed at the project root).\n5. `diff_against_existing()` — keyed by **filename slug** (not internal `data[\"name\"]`) so re-scans don't churn when the AI returns a display name vs the registry canonical slug.\n6. `_archive_removed()` — when a config disappears from detections, MOVE (not delete — user may have hand-edited) to `out_dir/.archived/<UTC-timestamp>/`. Runs after diff, before fresh writes.\n7. `maybe_publish()` — **native async** (WS11). Opt-in submission of freshly AI-generated configs to the community registry. Pre-checks `GITHUB_TOKEN`. Idempotency guard: `_find_existing_issue` queries GitHub Search API for an existing open issue with the same config name before submitting. Retries transient failures (rate limit, 5xx) with 0s/5s/15s backoff. `_prompt_async` wraps `input()` via `asyncio.to_thread` so the event loop isn't blocked.\n\n**CLI dispatch** uses the `COMMAND_CLASSES` table in `main.py` (added in WS1). `scan` and `doctor` are dispatched as `Cls(args).execute()` consuming the parsed argparse namespace directly — no `_reconstruct_argv` hack, no duplicate argparse. `ScanCommand.execute()` is the single `asyncio.run` boundary wrapping `run_scan` (sync) + `maybe_publish` (async). Remaining ~14 commands still use the legacy `COMMAND_MODULES` dispatch; they're flagged for migration.\n\n**Cost guardrails**: `--max-ai-generations N` (default 10) caps unbounded AI generation; `--dry-run` previews without writing or invoking AI; `--probe-urls` HEAD-checks AI-generated URLs with retry-on-404 and stamps `metadata._url_unverified` on confirmed-bad URLs.\n\n**Safety**: All writes use `_atomic_write_json` (`os.replace` after writing to `.tmp`) so a `KeyboardInterrupt` mid-write can't corrupt configs. `_safe_size` guards `stat()` so broken symlinks don't crash the scan. `ScanCommand.execute` calls `logging.basicConfig` so `logger.warning`/`error` is visible; exit code is non-zero when no configs and no codebase config were emitted.\n\n**Public constant**: `SourceDetector.CODE_PROJECT_MARKERS` (was `_CODE_PROJECT_MARKERS`) — shared between source_detector + signal_collectors. ~50 manifest types now (Pipfile, environment.yml, deno.json, flake.nix, Chart.yaml, deps.edn, dune-project, BUILD.bazel, …). Public so cross-module access doesn't reach into a private attribute.\n\n### SkillConverter Pattern (Template Method + Factory)\n\nAll 18 source types implement the `SkillConverter` base class (`skill_converter.py`):\n\n```python\nconverter = get_converter(\"web\", config)  # Factory lookup\nconverter.run()  # Template: extract() → build_skill()\n```\n\nRegistry in `CONVERTER_REGISTRY` maps source type → (module, class). `create_command.py` builds config from `ExecutionContext`, calls `get_converter()`, then runs centralized enhancement. `get_converter(\"config\", {...})` constructs `UnifiedScraper` from the same factory-shaped dict (no special cases in create_command/MCP). The base resolves `skill_dir` once (strips trailing separators) and derives `data_file` via `data_file_for()` — subclasses must not re-derive paths.\n\n### DocumentSkillBuilder (build side of 9 document scrapers)\n\n`cli/document_skill_builder.py:DocumentSkillBuilder` sits between `SkillConverter` and the 9 document scrapers (epub, word, pptx, html, pdf, jupyter, man, rss, chat). It owns `categorize_content`, reference-file writing (tables, truncation, image guard), `index.md` + `SKILL.md` generation, and `load_extracted_data`. Variation points are class attrs (`DOC_NOUN`, `SOURCE_LABEL`, `LOAD_TOTAL_KEY`, `PATTERN_KEYWORDS`, `RANGE_LABEL`, …) and small hook methods (`category_stem`, `_write_reference_section`, `_write_skill_md_metadata`). Output is pinned **byte-identical** by golden trees in `tests/golden/phase2/` — `UPDATE_GOLDENS=1` rewrites them, only do that deliberately. Surviving full-method overrides are domain-shaped and commented per scraper.\n\n### UnifiedScraper (multi-source configs)\n\n`unified_scraper.py` dispatches via the class-level `SOURCE_DISPATCH` table; `_scrape_with_converter()` is the shared engine for the 13 mechanical source types (`get_converter()` + public `converter.extract()` + cache copy + sub-skill build), so **new types registered in `CONVERTER_REGISTRY` work in unified configs automatically**. documentation/github/local stay bespoke (commented why). `run()` deliberately does NOT follow the base template (TestRunOrchestration pins that run() triggers workflows).\n\n### Data Flow (5 phases)\n\n1. **Scrape** - Source-specific scraper extracts content to `output/{name}_data/pages/*.json`\n2. **Build** - `build_skill()` categorizes pages, extracts patterns, generates `output/{name}/SKILL.md`\n3. **Enhance** (optional) - LLM rewrites SKILL.md (`--enhance-level 0-3`, auto-detects API vs LOCAL mode)\n4. **Package** - Platform adaptor formats output (`.zip`, `.tar.gz`, JSON, vector index)\n5. **Upload** (optional) - Platform API upload\n\n### Platform Adaptor Pattern (Strategy + Factory)\n\nFactory: `get_adaptor(platform, config)` in `adaptors/__init__.py` returns a `SkillAdaptor` instance. Base class `SkillAdaptor` + `SkillMetadata` in `adaptors/base.py`.\n\n```\nsrc/skill_seekers/cli/adaptors/\n├── __init__.py              # Factory: get_adaptor(platform, config), ADAPTORS registry\n├── base.py                  # Abstract base: SkillAdaptor, SkillMetadata\n├── openai_compatible.py     # Shared base for OpenAI-compatible platforms\n├── claude.py                # --target claude\n├── gemini.py                # --target gemini\n├── openai.py                # --target openai\n├── markdown.py              # --target markdown\n├── minimax.py               # --target minimax\n├── opencode.py              # --target opencode\n├── kimi.py                  # --target kimi\n├── deepseek.py              # --target deepseek\n├── qwen.py                  # --target qwen\n├── openrouter.py            # --target openrouter\n├── together.py              # --target together\n├── fireworks.py             # --target fireworks\n├── langchain.py             # --target langchain\n├── llama_index.py           # --target llama-index\n├── haystack.py              # --target haystack\n├── chroma.py                # --target chroma\n├── faiss_helpers.py         # --target faiss\n├── qdrant.py                # --target qdrant\n├── weaviate.py              # --target weaviate\n├── pinecone_adaptor.py      # --target pinecone\n└── streaming_adaptor.py     # --target streaming\n```\n\nAll adaptors use `--target`. All adaptors are imported with `try/except ImportError` so missing optional deps don't break the registry.\n\n### 18 Source Type Converters\n\nEach in `src/skill_seekers/cli/{type}_scraper.py` as a `SkillConverter` subclass (no `main()`). The `create_command.py` uses `source_detector.py` to auto-detect, then calls `get_converter()`. Converters: web (doc_scraper), github, pdf, word, epub, video, local (codebase_scraper), jupyter, html, openapi, asciidoc, pptx, rss, manpage, confluence, notion, chat, config (unified_scraper).\n\n### CLI Argument System (single-definition parsers)\n\n```\nsrc/skill_seekers/cli/\n├── parsers/              # Central SubcommandParser classes — the ONLY definition of each command's flags\n│   └── create_parser.py  # Progressive help disclosure (--help-web, --help-github, etc.)\n├── arguments/            # Argument definitions\n│   ├── common.py         # add_all_standard_arguments() - shared across all scrapers\n│   └── create.py         # UNIVERSAL_ARGUMENTS, WEB_ARGUMENTS, GITHUB_ARGUMENTS, etc.\n├── exit_codes.py         # EXIT_SUCCESS/ERROR/VALIDATION/INTERRUPT\n└── source_detector.py    # Auto-detect source type from input string\n```\n\nCommand modules' standalone `main(args=None)` paths build their parser FROM the central `SubcommandParser` class — **add/change a flag in `parsers/*.py` only**. Drift guards (`tests/test_cli_parsers.py::TestCentralModuleParserSync` and `TestCentralParserSingleSource`) fail CI on any divergence of dests/defaults/option strings.\n\n`ExecutionContext.override()` is context-local (a `ContextVar` layered over the unchanged base singleton) — thread/async safe for the MCP server; propagate to worker threads via `copy_context`.\n\n### Standalone subsystems (outside `cli/`)\n\nFour top-level packages sit beside `cli/` and are largely independent of the scrape→build→package flow:\n\n- `embedding/` — FastAPI embedding-generation server (`python -m skill_seekers.embedding.server`) with a caching layer (`cache.py`) and multi-backend generators (OpenAI, sentence-transformers, Anthropic). Feeds the vector-DB adaptors.\n- `sync/` — real-time doc-sync system: `detector.py` (content-hash / last-modified change detection), `monitor.py` (scheduled incremental re-scrapes), `notifier.py` (email/Slack/webhook). Keeps generated skills fresh as upstream docs change.\n- `benchmark/` — performance suite (`runner.py`, `framework.py`) measuring scrape/embedding/storage/e2e timing, memory, and CPU; emits comparison + optimization reports.\n- `workflows/` — bundled default enhancement-workflow presets consumed by the enhancement step.\n\n### C3.x Codebase Analysis Pipeline\n\nLocal codebase analysis features, all opt-out (`--skip-*` flags):\n- C3.1 `pattern_recognizer.py` - Design pattern detection (10 GoF patterns, 9 languages)\n- C3.2 `test_example_extractor.py` - Usage examples from tests\n- C3.3 `how_to_guide_builder.py` - AI-enhanced educational guides\n- C3.4 `config_extractor.py` - Configuration pattern extraction\n- C3.5 `generate_router.py` - Architecture overview generation\n- C3.10 `signal_flow_analyzer.py` - Godot signal flow analysis\n\n### MCP Server\n\n`src/skill_seekers/mcp/server_fastmcp.py` - 40 tools via FastMCP. Transport: stdio (Claude Code) or HTTP (Cursor/Windsurf). Optional dependency: `pip install -e \".[mcp]\"`\n\n- **Tools run in-process** via `run_cli_main()` in `mcp/tools/_common.py`: same argv parsed by the command's REAL parser (sys.argv patch under a lock), stdout/stderr capture + contextvar log capture, identical `(stdout, stderr, returncode)` contract. No subprocess startup; old hard timeouts are advisory.\n- **Exceptions BY DESIGN**: `enhance_skill` (LOCAL agent) and `install_skill`'s enhancement step stay subprocess — the agent must be a real child process for the fork-bomb-guard env semantics (`SKILL_SEEKER_ENHANCE_ACTIVE`). Never make these in-process.\n- **Domain logic lives in `skill_seekers.services/`** (marketplace_manager, marketplace_publisher, config_publisher, source_manager, git_repo) — importable by CLI without the `[mcp]` extra; old `skill_seekers.mcp.*` paths are back-compat shims. No `sys.path` hacks anywhere in `mcp/`.\n\n### Seeker HUD (web UI)\n\nFastAPI backend in `src/skill_seekers/web/`, React app in `ui/`; see `docs/guides/WEB_UI.md`.\n\n- HUD routes live in `src/skill_seekers/web/routes/` (one module per screen, `register(app, ctx)`); `app.py` keeps the original routes.\n\n### Enhancement (AgentClient is the single AI transport)\n\nEvery AI call goes through `AgentClient` (`src/skill_seekers/cli/agent_client.py`): central truncation gate, timeout policy, error classification. `API_PROVIDERS` (provider registry) and `AGENT_PRESETS` (local-agent command templates) live ONLY there. Each `API_PROVIDERS` entry declares its wire `protocol` (`anthropic`/`openai`/`google`) and `supports_images` capability — `_call_api` branches on the resolved protocol, NOT the provider name, so an OpenAI/Anthropic-compatible provider needs no new branch. Adaptors declare provider/endpoint/model/prompt and route through `SkillAdaptor._enhance_skill_md_via_client` (atomic save with backup). Multimodal image input goes through `AgentClient.call_with_image()` (used by `video_visual` frame OCR across all image-capable providers); it no longer bypasses AgentClient with a direct SDK call.\n\n- **API mode** (if API key set): Anthropic, Google Gemini, OpenAI, Moonshot/Kimi, MiniMax — detected in registry order; `SKILL_SEEKER_PROVIDER` forces one. Models: `SKILL_SEEKER_MODEL` (global) or `ANTHROPIC_MODEL`/`GOOGLE_MODEL`/`OPENAI_MODEL`/`MOONSHOT_MODEL`/`MINIMAX_MODEL`; `ANTHROPIC_BASE_URL` for compatible endpoints. MiniMax adds `MINIMAX_API_REGION` (`global_en`/`cn_zh`), `MINIMAX_API_PROTOCOL` (`openai`/`anthropic`) and `MINIMAX_THINKING` (`adaptive`/`disabled`, OpenAI protocol only; validated at `AgentClient` construction). Video input (`AgentClient.call_with_video()`, MiniMax-M3 only, 50 MB cap) is registry-driven like images: `supports_video`, `video_models`, `video_max_bytes`, `thinking_modes`, `thinking_env` on the provider entry. Vision OCR provider: `SKILL_SEEKER_VISION_PROVIDER` (`auto` picks the first image-capable provider with a key).\n- **LOCAL mode** (fallback): Claude Code, Kimi Code, Codex, Copilot, OpenCode, custom agents — command built by `build_local_agent_command()`.\n- Control: `--enhance-level 0` (off) / `1` (SKILL.md only) / `2` (default, balanced) / `3` (full)\n- Agent selection: `--agent claude|codex|copilot|opencode|kimi|custom`\n\n## Key Implementation Details\n\n### Smart Categorization (`doc_scraper.py:smart_categorize()`)\n\nScores pages against category keywords: 3 points for URL match, 2 for title, 1 for content. Threshold of 2+ required. Falls back to \"other\".\n\n### Content Extraction (`doc_scraper.py`)\n\n`FALLBACK_MAIN_SELECTORS` constant + `_find_main_content()` helper handle CSS selector fallback. Links are extracted from the full page before early return (not just main content). `body` is deliberately excluded from fallbacks.\n\n### Three-Stream GitHub Architecture (`unified_codebase_analyzer.py`)\n\nStream 1: Code Analysis (AST, patterns, tests, guides). Stream 2: Documentation (README, docs/, wiki). Stream 3: Community (issues, PRs, metadata). Depth control: `basic` (1-2 min) or `c3x` (20-60 min).\n\n## Testing\n\n### Test markers (pytest.ini)\n\n```bash\npytest tests/ -v                                    # Default: fast tests only\npytest tests/ -v -m slow                            # Include slow tests (>5s)\npytest tests/ -v -m integration                     # External services required\npytest tests/ -v -m e2e                             # Resource-intensive\npytest tests/ -v -m \"not slow and not integration\"  # Fastest subset\n```\n\n### Known legitimate skips (~11)\n\n- 2: chromadb incompatible with Python 3.14 (pydantic v1)\n- 2: weaviate-client not installed\n- 2: Qdrant not running (requires docker)\n- 2: langchain/llama_index not installed\n- 3: GITHUB_TOKEN not set\n\n### sys.modules gotcha\n\n`test_swift_detection.py` deletes `skill_seekers.cli` modules from `sys.modules`. It must save and restore both `sys.modules` entries AND parent package attributes (`setattr`). See the test file for the pattern.\n\n## Dependencies\n\nCore deps include `langchain`, `llama-index`, `anthropic`, `httpx`, `PyMuPDF`, `pydantic`. Platform-specific deps are optional:\n\n```bash\npip install -e \".[mcp]\"       # MCP server\npip install -e \".[gemini]\"    # Google Gemini\npip install -e \".[openai]\"    # OpenAI\npip install -e \".[docx]\"      # Word documents\npip install -e \".[epub]\"      # EPUB books\npip install -e \".[video]\"     # Video (lightweight)\npip install -e \".[video-full]\"# Video (Whisper + visual)\npip install -e \".[jupyter]\"   # Jupyter notebooks\npip install -e \".[pptx]\"      # PowerPoint\npip install -e \".[rss]\"       # RSS/Atom feeds\npip install -e \".[confluence]\"# Confluence wiki\npip install -e \".[notion]\"    # Notion pages\npip install -e \".[chroma]\"    # ChromaDB\npip install -e \".[all]\"       # Everything (except video-full)\n```\n\nDev dependencies use PEP 735 `[dependency-groups]` in pyproject.toml.\n\n## Environment Variables\n\n```bash\nANTHROPIC_API_KEY=sk-ant-...          # Claude AI (or compatible endpoint)\nANTHROPIC_BASE_URL=https://...        # Optional: Claude-compatible API endpoint\nGOOGLE_API_KEY=AIza...                # Google Gemini (optional)\nOPENAI_API_KEY=sk-...                 # OpenAI (optional)\nGITHUB_TOKEN=ghp_...                  # Higher GitHub rate limits\n```\n\n## Adding New Features\n\n### New platform adaptor\n1. Create `src/skill_seekers/cli/adaptors/{platform}.py` inheriting `SkillAdaptor` from `base.py`\n2. Register in `adaptors/__init__.py` (add try/except import + add to `ADAPTORS` dict)\n3. Add optional dep to `pyproject.toml`\n4. Add tests in `tests/`\n\n### New source type converter\n1. Create `src/skill_seekers/cli/{type}_scraper.py` — for document-shaped sources inherit `DocumentSkillBuilder` (categorization/references/index/SKILL.md come free; implement `extract()` + hooks), otherwise inherit `SkillConverter` and implement `extract()` and `build_skill()`. Set `SOURCE_TYPE`.\n2. Register in `CONVERTER_REGISTRY` in `skill_converter.py` — this also makes the type work in unified configs automatically (UnifiedScraper engine)\n3. Add source type config building in `create_command.py:_build_config()`\n4. Add auto-detection in `source_detector.py`\n5. Add optional dep if needed\n6. Add tests\n\n### New CLI argument\n- Subcommand flag: define ONLY in the central parser class (`parsers/{cmd}_parser.py`) — module `main()` builds from it; the drift-guard test fails otherwise\n- Universal: `UNIVERSAL_ARGUMENTS` in `arguments/create.py`\n- Source-specific: appropriate dict (`WEB_ARGUMENTS`, `GITHUB_ARGUMENTS`, etc.)\n- Shared across scrapers: `add_all_standard_arguments()` in `arguments/common.py`\n\n<!-- File: distribution/claude-plugin/skills/skill-builder/SKILL.md (Tokens: ~1109 | Category: anthropic-skill) -->\n---\nname: skill-builder\ndescription: Automatically detect source types and build AI skills using Skill Seekers. Use when the user wants to create skills from documentation, repos, PDFs, videos, or other knowledge sources.\n---\n\n# Skill Builder\n\nThis skill uses the Skill Seekers MCP server, which provides 40 tools for converting knowledge sources into AI-ready skills. If the MCP tools are not available, use the CLI fallback at the bottom of this file instead — do not stop.\n\n## Prerequisites\n\nThe MCP tools below only work when the Skill Seekers MCP server is connected:\n\n1. Install the package: `pip install \"skill-seekers[mcp]\"`\n2. Connect the server:\n   - Installed as the Skill Seekers plugin? Nothing to do — the plugin's bundled `.mcp.json` starts the server automatically (it still needs step 1).\n   - Installed standalone (e.g. copied into `~/.claude/skills/`)? Register the server once: `claude mcp add skill-seekers -- python -m skill_seekers.mcp.server_fastmcp`\n\nIf tools like `scrape_docs` or `package_skill` are not in your tool list, the server is not connected. Tell the user about the two steps above, and use the CLI fallback in the meantime.\n\n## When to Use This Skill\n\nUse this skill when the user:\n- Wants to create an AI skill from a documentation site, GitHub repo, PDF, video, or other source\n- Needs to convert documentation into a format suitable for LLM consumption\n- Wants to update or sync existing skills with their source documentation\n- Needs to export skills to vector databases (Weaviate, Chroma, FAISS, Qdrant)\n- Asks about scraping, converting, or packaging documentation for AI\n\n## Source Type Detection\n\nAutomatically detect the source type from user input:\n\n| Input Pattern | Source Type | Tool to Use |\n|---------------|-------------|-------------|\n| `https://...` (not GitHub/YouTube) | Documentation | `scrape_docs` |\n| `owner/repo` or `github.com/...` | GitHub | `scrape_github` |\n| `*.pdf` | PDF | `scrape_pdf` |\n| YouTube/Vimeo URL or video file | Video | `scrape_video` |\n| Local directory path | Codebase | `scrape_codebase` |\n| `*.ipynb`, `*.html`, `*.yaml` (OpenAPI), `*.adoc`, `*.pptx`, `*.rss`, `*.1`-`.8` | Various | `scrape_generic` |\n| JSON config file | Unified | Use config with `scrape_docs` |\n\n## Recommended Workflow\n\n1. **Detect source type** from the user's input\n2. **Generate or fetch config** using `generate_config` or `fetch_config` if needed\n3. **Estimate scope** with `estimate_pages` for documentation sites\n4. **Scrape the source** using the appropriate scraping tool\n5. **Enhance** with `enhance_skill` if the user wants AI-powered improvements\n6. **Package** with `package_skill` for the target platform\n7. **Export to vector DB** if requested using `export_to_*` tools\n\n## Available MCP Tools\n\n### Config Management\n- `generate_config` — Generate a scraping config from a URL\n- `list_configs` — List available preset configs\n- `validate_config` — Validate a config file\n\n### Scraping (use based on source type)\n- `scrape_docs` — Documentation sites\n- `scrape_github` — GitHub repositories\n- `scrape_pdf` — PDF files\n- `scrape_video` — Video transcripts\n- `scrape_codebase` — Local code analysis\n- `scrape_generic` — Jupyter, HTML, OpenAPI, AsciiDoc, PPTX, RSS, manpage, Confluence, Notion, chat\n\n### Post-processing\n- `enhance_skill` — AI-powered skill enhancement\n- `package_skill` — Package for target platform\n- `upload_skill` — Upload to platform API\n- `install_skill` — End-to-end install workflow\n\n### Advanced\n- `detect_patterns` — Design pattern detection in code\n- `extract_test_examples` — Extract usage examples from tests\n- `build_how_to_guides` — Generate how-to guides from tests\n- `split_config` — Split large configs into focused skills\n- `export_to_weaviate`, `export_to_chroma`, `export_to_faiss`, `export_to_qdrant` — Vector DB export\n\n## CLI Fallback (MCP server not connected)\n\nThe same pipeline is available from the command line (requires `pip install skill-seekers`). Run it with the Bash tool:\n\n```bash\nskill-seekers create <source>                      # auto-detects: URL, owner/repo, ./path, file.pdf, video URL, ...\nskill-seekers package <skill_dir> --target claude  # or gemini/openai/langchain/chroma/...\n```\n\n`create` covers detection, scraping, and building in one step; add `--enhance-level 0` to skip AI enhancement. After it finishes, read the generated `SKILL.md` and summarize what was created.\n\n<!-- File: skills/skill-seekers/SKILL.md (Tokens: ~768 | Category: anthropic-skill) -->\n---\nname: skill-builder\ndescription: Automatically detect source types and build AI skills using Skill Seekers. Use when the user wants to create skills from documentation, repos, PDFs, videos, or other knowledge sources.\n---\n\n# Skill Builder\n\nYou have access to the Skill Seekers MCP server which provides 40 tools for converting knowledge sources into AI-ready skills.\n\n## When to Use This Skill\n\nUse this skill when the user:\n- Wants to create an AI skill from a documentation site, GitHub repo, PDF, video, or other source\n- Needs to convert documentation into a format suitable for LLM consumption\n- Wants to update or sync existing skills with their source documentation\n- Needs to export skills to vector databases (Weaviate, Chroma, FAISS, Qdrant)\n- Asks about scraping, converting, or packaging documentation for AI\n\n## Source Type Detection\n\nAutomatically detect the source type from user input:\n\n| Input Pattern | Source Type | Tool to Use |\n|---------------|-------------|-------------|\n| `https://...` (not GitHub/YouTube) | Documentation | `scrape_docs` |\n| `owner/repo` or `github.com/...` | GitHub | `scrape_github` |\n| `*.pdf` | PDF | `scrape_pdf` |\n| YouTube/Vimeo URL or video file | Video | `scrape_video` |\n| Local directory path | Codebase | `scrape_codebase` |\n| `*.ipynb`, `*.html`, `*.yaml` (OpenAPI), `*.adoc`, `*.pptx`, `*.rss`, `*.1`-`.8` | Various | `scrape_generic` |\n| JSON config file | Unified | Use config with `scrape_docs` |\n\n## Recommended Workflow\n\n1. **Detect source type** from the user's input\n2. **Generate or fetch config** using `generate_config` or `fetch_config` if needed\n3. **Estimate scope** with `estimate_pages` for documentation sites\n4. **Scrape the source** using the appropriate scraping tool\n5. **Enhance** with `enhance_skill` if the user wants AI-powered improvements\n6. **Package** with `package_skill` for the target platform\n7. **Export to vector DB** if requested using `export_to_*` tools\n\n## Available MCP Tools\n\n### Config Management\n- `generate_config` — Generate a scraping config from a URL\n- `list_configs` — List available preset configs\n- `validate_config` — Validate a config file\n\n### Scraping (use based on source type)\n- `scrape_docs` — Documentation sites\n- `scrape_github` — GitHub repositories\n- `scrape_pdf` — PDF files\n- `scrape_video` — Video transcripts\n- `scrape_codebase` — Local code analysis\n- `scrape_generic` — Jupyter, HTML, OpenAPI, AsciiDoc, PPTX, RSS, manpage, Confluence, Notion, chat\n\n### Post-processing\n- `enhance_skill` — AI-powered skill enhancement\n- `package_skill` — Package for target platform\n- `upload_skill` — Upload to platform API\n- `install_skill` — End-to-end install workflow\n\n### Advanced\n- `detect_patterns` — Design pattern detection in code\n- `extract_test_examples` — Extract usage examples from tests\n- `build_how_to_guides` — Generate how-to guides from tests\n- `split_config` — Split large configs into focused skills\n- `export_to_weaviate`, `export_to_chroma`, `export_to_faiss`, `export_to_qdrant` — Vector DB export\n\n<!-- File: tests/golden/phase2/chat_empty/SKILL.md (Tokens: ~273 | Category: anthropic-skill) -->\n---\nname: golden-chat-empty\ndescription: Use when testing the golden_chat_empty golden build\n---\n\n# Golden_Chat_Empty Slack Chat Skill\n\nUse when testing the golden_chat_empty golden build\n\n## 📋 Slack Chat Information\n\n**Platform:** Slack\n\n**Source:** fixtures/empty-export/\n\n**Total Messages:** 0\n\n**Unique Users:** 0\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat_empty chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 0\n\n**Content Breakdown:**\n\n- **Chat Content**: 0 sections\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 0\n- **Total Threads**: 0\n- **Code Snippets**: 0\n- **Shared Links**: 0\n- **Unique Users**: 0\n- **Channels**: 0\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_01.md` - Chat Content\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Slack Chat Scraper\n\n<!-- File: tests/golden/phase2/chat_single/SKILL.md (Tokens: ~293 | Category: anthropic-skill) -->\n---\nname: golden-chat-single\ndescription: Use when testing the golden_chat_single golden build\n---\n\n# Golden_Chat_Single Slack Chat Skill\n\nUse when testing the golden_chat_single golden build\n\n## 📋 Slack Chat Information\n\n**Platform:** Slack\n\n**Source:** fixtures/slack-export/\n\n**Total Messages:** 1\n\n**Unique Users:** 1\n\n**Channels:** #general\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat_single chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 1\n\n**Content Breakdown:**\n\n- **General Discussion**: 1 sections\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 1\n- **Total Threads**: 0\n- **Code Snippets**: 0\n- **Shared Links**: 0\n- **Unique Users**: 1\n- **Channels**: 1\n\n**Channel Activity:**\n\n- #general: 1 messages, 1 users\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/main.md` - General Discussion\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Slack Chat Scraper\n\n<!-- File: tests/golden/phase2/chat_topics/SKILL.md (Tokens: ~379 | Category: anthropic-skill) -->\n---\nname: golden-chat-topics\ndescription: Use when testing the golden_chat_topics golden build\n---\n\n# Golden_Chat_Topics Discord Chat Skill\n\nUse when testing the golden_chat_topics golden build\n\n## 📋 Discord Chat Information\n\n**Platform:** Discord\n\n**Source:** fixtures/discord-export.json\n\n**Total Messages:** 3\n\n**Unique Users:** 2\n\n**Channels:** #help\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat_topics chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Troubleshooting**: 1 sections\n- **General Discussion**: 1 sections\n\n## 🔑 Key Discussion Topics\n\n*Topics frequently discussed in chat*\n\n- **Troubleshooting**: 1 conversations\n- **Setup**: 1 conversations\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 3\n- **Total Threads**: 0\n- **Code Snippets**: 0\n- **Shared Links**: 0\n- **Unique Users**: 2\n- **Channels**: 1\n\n**Channel Activity:**\n\n- #help: 3 messages, 2 users\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/setup_s2-s2.md` - Setup\n- `references/troubleshooting_s1-s1.md` - Troubleshooting\n- `references/general_s3-s3.md` - General Discussion\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Discord Chat Scraper\n\n<!-- File: tests/golden/phase2/chat/SKILL.md (Tokens: ~1100 | Category: anthropic-skill) -->\n---\nname: golden-chat\ndescription: Use when testing the golden_chat golden build\n---\n\n# Golden_Chat Slack Chat Skill\n\nUse when testing the golden_chat golden build\n\n## 📋 Slack Chat Information\n\n**Platform:** Slack\n\n**Source:** fixtures/slack-export/\n\n**Total Messages:** 6\n\n**Unique Users:** 3\n\n**Channels:** #engineering, #random\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Find solutions discussed in golden_chat chat history\n- Reference code snippets shared by team members\n- Understand team decisions and architectural discussions\n- Look up troubleshooting steps from past conversations\n- Find shared links and resources from the team\n\n## 📖 Content Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **#engineering**: 2 sections\n- **#random**: 1 sections\n\n## 🔑 Key Discussion Topics\n\n*Topics frequently discussed in chat*\n\n- **Troubleshooting**: 1 conversations\n- **Setup**: 1 conversations\n\n## 📝 Top Code Snippets\n\n*High-quality code shared in chat*\n\n### Python (2 snippets)\n\n**Snippet 1** (by bob) (Quality: 9.5/10):\n\n```python\ndef long_helper():\n    y0 = 0\n    y1 = 1\n    y2 = 2\n    y3 = 3\n    y4 = 4\n    y5 = 5\n    y6 = 6\n    y7 = 7\n    y8 = 8\n    y9 = 9\n    y10 = 10\n    y11 = 11\n    y12 = 12\n    y13 = 13\n    y14 = 14\n    y15 = 15\n    y16 = 16\n    y17 = 17\n    y18 = 18\n    y19 = 19\n    y20 = 20\n    y21 = 21\n    y22 = 22\n    y23 = 23\n    y24 = 24\n    y25 = 25\n    y26 = 26\n    y27 = 27\n    y28 = 28\n    y29 = 29\n    y30 = 30\n    y31 = 31\n    y32 = 32\n    y33 = 33\n    y34 = 34\n    y35 = 35\n    y36 = 36\n    y37 = 37\n    y38\n...\n```\n\n**Snippet 2** (by bob) (Quality: 7.0/10):\n\n```python\nprint('patched')\n```\n\n### Unknown (1 snippets)\n\n**Snippet 1** (by alice) (Quality: 4.0/10):\n\n```unknown\nkubectl get pods\n```\n\n## 🔗 Shared Links (21)\n\n*Key resources shared in chat*\n\n- https://example.com/resource/0 (by alice, in #engineering)\n- https://example.com/resource/1 (by carol, in #random)\n- https://example.com/resource/2 (by alice, in #engineering)\n- https://example.com/resource/3 (by carol, in #random)\n- https://example.com/resource/4 (by alice, in #engineering)\n- https://example.com/resource/5 (by carol, in #random)\n- https://example.com/resource/6 (by alice, in #engineering)\n- https://example.com/resource/7 (by carol, in #random)\n- https://example.com/resource/8 (by alice, in #engineering)\n- https://example.com/resource/9 (by carol, in #random)\n- https://example.com/resource/10 (by alice, in #engineering)\n- https://example.com/resource/11 (by carol, in #random)\n- https://example.com/resource/12 (by alice, in #engineering)\n- https://example.com/resource/13 (by carol, in #random)\n- https://example.com/resource/14 (by alice, in #engineering)\n- https://example.com/resource/15 (by carol, in #random)\n- https://example.com/resource/16 (by alice, in #engineering)\n- https://example.com/resource/17 (by carol, in #random)\n- https://example.com/resource/18 (by alice, in #engineering)\n- https://example.com/resource/19 (by carol, in #random)\n\n*... and 1 more links*\n\n## 📊 Chat Statistics\n\n- **Total Messages**: 6\n- **Total Threads**: 1\n- **Code Snippets**: 3\n- **Shared Links**: 21\n- **Unique Users**: 3\n- **Channels**: 2\n\n**Channel Activity:**\n\n- #engineering: 5 messages, 2 users\n- #random: 1 messages, 1 users\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/engineering_s1-s2.md` - #engineering\n- `references/random_s3-s3.md` - #random\n\nSee `references/index.md` for complete chat structure.\n\n---\n\n**Generated by Skill Seeker** | Slack Chat Scraper\n\n<!-- File: tests/golden/phase2/epub_kw/SKILL.md (Tokens: ~821 | Category: anthropic-skill) -->\n---\nname: golden-epub-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Epub_Kw Documentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_epub_kw concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Api**: 1 sections\n- **Other**: 1 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 1\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s2-s2.md` - Api\n- `references/section_s3-s3.md` - Other\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | EPUB Scraper\n\n<!-- File: tests/golden/phase2/epub/SKILL.md (Tokens: ~814 | Category: anthropic-skill) -->\n---\nname: golden-epub\ndescription: Use when testing the epub golden build\n---\n\n# Golden_Epub Documentation Skill\n\nUse when testing the epub golden build\n\n## 📋 Document Information\n\n**Title:** The Handbook\n\n**Author:** Jane Doe\n\n**Language:** en\n\n**Publisher:** Acme Press\n\n**Date:** 2024-01-01\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_epub concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **handbook**: 3 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 1\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/handbook.md` - handbook\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | EPUB Scraper\n\n<!-- File: tests/golden/phase2/html_kw/SKILL.md (Tokens: ~845 | Category: anthropic-skill) -->\n---\nname: golden-html-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Html_Kw Documentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_html_kw concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 4\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Api**: 1 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n- Changelog\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Changelog** (1 sections):\n- Changelog (section 4)\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 4\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **HTML Files**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s2-s2.md` - Api\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | HTML Scraper\n\n<!-- File: tests/golden/phase2/html_multi/SKILL.md (Tokens: ~855 | Category: anthropic-skill) -->\n---\nname: golden-html-multi\ndescription: Use when testing the multi-file html build\n---\n\n# Golden_Html_Multi Documentation Skill\n\nUse when testing the multi-file html build\n\n## 📋 Document Information\n\n**Title:** The Web Handbook\n\n**Source files:** 2 HTML files\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_html_multi concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 4\n\n**Content Breakdown:**\n\n- **intro**: 2 sections\n- **extras**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n- Changelog\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Changelog** (1 sections):\n- Changelog (section 4)\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 4\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **HTML Files**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/golden_html_multi_s1-s2.md` - intro\n- `references/golden_html_multi_s3-s4.md` - extras\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | HTML Scraper\n\n<!-- File: tests/golden/phase2/html/SKILL.md (Tokens: ~836 | Category: anthropic-skill) -->\n---\nname: golden-html\ndescription: Use when testing the html golden build\n---\n\n# Golden_Html Documentation Skill\n\nUse when testing the html golden build\n\n## 📋 Document Information\n\n**Title:** The Web Handbook\n\n**Author:** Jane Doe\n\n**Language:** en\n\n**Description:** A handbook about the web.\n\n**Keywords:** web, html, docs\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_html concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 4\n\n**Content Breakdown:**\n\n- **page**: 4 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n- Changelog\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Changelog** (1 sections):\n- Changelog (section 4)\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 4\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **HTML Files**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/page.md` - page\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | HTML Scraper\n\n<!-- File: tests/golden/phase2/jupyter_dir/SKILL.md (Tokens: ~869 | Category: anthropic-skill) -->\n---\nname: golden-jupyter-dir\ndescription: Use when testing the golden_jupyter_dir golden build\n---\n\n# Golden_Jupyter_Dir Notebook Skill\n\nUse when testing the golden_jupyter_dir golden build\n\n## 📋 Notebook Information\n\n**Kernel:** Python 3\n\n**Language:** python 3.11.4\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter_dir concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **Data Loading**: 1 sections\n- **Evaluation**: 1 sections\n- **Setup**: 1 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s2-s2.md` - Data Loading\n- `references/section_s5-s5.md` - Evaluation\n- `references/section_s1-s1.md` - Setup\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n\n<!-- File: tests/golden/phase2/jupyter_kw/SKILL.md (Tokens: ~866 | Category: anthropic-skill) -->\n---\nname: golden-jupyter-kw\ndescription: Use when testing the golden_jupyter_kw golden build\n---\n\n# Golden_Jupyter_Kw Notebook Skill\n\nUse when testing the golden_jupyter_kw golden build\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter_kw concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Modeling**: 1 sections\n- **Loading**: 1 sections\n- **Empty Cat**: 0 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s5-s5.md` - Modeling\n- `references/section_s2-s2.md` - Loading\n- `references/section_04.md` - Empty Cat\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n\n<!-- File: tests/golden/phase2/jupyter_topics/SKILL.md (Tokens: ~870 | Category: anthropic-skill) -->\n---\nname: golden-jupyter-topics\ndescription: Use when testing the golden_jupyter_topics golden build\n---\n\n# Golden_Jupyter_Topics Notebook Skill\n\nUse when testing the golden_jupyter_topics golden build\n\n## 📋 Notebook Information\n\n**Kernel:** Python 3\n\n**Language:** python 3.11.4\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter_topics concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **Data Loading**: 1 sections\n- **Evaluation**: 1 sections\n- **Setup**: 1 sections\n- **Other**: 2 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s2-s2.md` - Data Loading\n- `references/section_s5-s5.md` - Evaluation\n- `references/section_s1-s1.md` - Setup\n- `references/section_s3-s4.md` - Other\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n\n<!-- File: tests/golden/phase2/jupyter/SKILL.md (Tokens: ~791 | Category: anthropic-skill) -->\n---\nname: golden-jupyter\ndescription: Use when testing the golden_jupyter golden build\n---\n\n# Golden_Jupyter Notebook Skill\n\nUse when testing the golden_jupyter golden build\n\n## 📋 Notebook Information\n\n**Kernel:** Python 3\n\n**Language:** python 3.11.4\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_jupyter concepts and analysis workflow\n- Reference code examples and their outputs\n- Reproduce data analysis or computation steps\n- Review methodology, visualizations, and results\n- Find library usage patterns and best practices\n\n## 📖 Section Overview\n\n**Total Sections:** 5\n\n**Content Breakdown:**\n\n- **analysis**: 5 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this notebook*\n\n**Major Topics:**\n\n- Getting Started\n\n**Subtopics:**\n\n- Modeling Results\n\n## 📦 Dependencies\n\n*3 package(s) imported*\n\n- `numpy`\n- `pandas`\n- `sklearn`\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started (section 1)\n\n**Modeling** (1 sections):\n- Modeling Results (section 5)\n\n## 📝 Code Examples\n\n*High-quality code cells from notebook*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 5.0/10):\n\n```bash\npip install pandas\n```\n\n### Python Examples (3)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**In [2]** (Quality: 7.5/10):\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\ndf.head()\n```\n\n**Example 3** (Quality: 2.0/10):\n\n```python\n%timeit broken()\n```\n\n## 📊 Notebook Statistics\n\n- **Total Sections**: 5\n- **Code Cells**: 2\n- **Markdown Cells**: 2\n- **Raw Cells**: 1\n- **Notebooks**: 1\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 3 code cells\n- bash: 1 code cells\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/analysis.md` - analysis\n\nSee `references/index.md` for complete notebook structure.\n\n---\n\n**Generated by Skill Seeker** | Jupyter Notebook Scraper\n\n<!-- File: tests/golden/phase2/man_kw/SKILL.md (Tokens: ~447 | Category: anthropic-skill) -->\n---\nname: golden-man-kw\ndescription: Use when testing the man golden build\n---\n\n# Golden_Man_Kw Man Pages Skill\n\nUse when testing the man golden build\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_man_kw command-line tools and their options\n- Look up command syntax and usage patterns\n- Find examples of common command invocations\n- Review available flags and environment variables\n- Explore related commands via SEE ALSO references\n\n## Quick Command Reference\n\n### git-log\n\n```\ngit log [<options>] [<revision-range>] [[--] <path>...]\n```\n\n### git-diff\n\n```\ngit diff [<options>] [<commit>] [--] [<path>...]\n```\n\n## Man Page Overview\n\n**Total Man Pages:** 3\n\n**Content Breakdown:**\n\n- **Version Control**: 2 man page(s)\n- **Other**: 1 man page(s)\n\n## Common Options\n\n*3 options extracted across all man pages*\n\n### git-log\n\n- `-p` -- Generate patch output.\n- `--max-count=<number>` -- Limit the number of commits to output, interacting subtly with pathspec filtering, history simplification, and the --fol...\n\n### curl\n\n- `-s, --silent` -- Silent mode.\n\n## Examples\n\n*3 example(s) extracted from man pages*\n\n### git-log\n\nShow the last three commits\n\n```bash\ngit log -3\n```\n\n### git-log\n\nProse-only example with no command\n\n### curl\n\nFetch a page\n\n```bash\ncurl https://example.com\n```\n\n## Related Commands (SEE ALSO)\n\n- `git-diff`\n- `git-log`\n- `gitk`\n\n## Documentation Statistics\n\n- **Total Man Pages**: 3\n- **Total Options**: 3\n- **Total Examples**: 3\n- **Cross-references**: 3\n\n## Navigation\n\n**Reference Files:**\n\n- `references/version_control_01.md` -- Version Control\n- `references/other_02.md` -- Other\n\nSee `references/index.md` for complete reference structure.\n\n---\n\n**Generated by Skill Seekers** | Man Page Scraper\n\n<!-- File: tests/golden/phase2/man_single/SKILL.md (Tokens: ~265 | Category: anthropic-skill) -->\n---\nname: golden-man-single\ndescription: Use when testing the man golden build\n---\n\n# Golden_Man_Single Man Pages Skill\n\nUse when testing the man golden build\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_man_single command-line tools and their options\n- Look up command syntax and usage patterns\n- Find examples of common command invocations\n- Review available flags and environment variables\n- Explore related commands via SEE ALSO references\n\n## Man Page Overview\n\n**Total Man Pages:** 1\n\n**Content Breakdown:**\n\n- **curl**: 1 man page(s)\n\n## Common Options\n\n*1 options extracted across all man pages*\n\n### curl\n\n- `-s, --silent` -- Silent mode.\n\n## Examples\n\n*1 example(s) extracted from man pages*\n\n### curl\n\nFetch a page\n\n```bash\ncurl https://example.com\n```\n\n## Documentation Statistics\n\n- **Total Man Pages**: 1\n- **Total Options**: 1\n- **Total Examples**: 1\n- **Cross-references**: 0\n\n## Navigation\n\n**Reference Files:**\n\n- `references/curl.md` -- curl\n\nSee `references/index.md` for complete reference structure.\n\n---\n\n**Generated by Skill Seekers** | Man Page Scraper\n\n<!-- File: tests/golden/phase2/man/SKILL.md (Tokens: ~440 | Category: anthropic-skill) -->\n---\nname: golden-man\ndescription: Use when testing the man golden build\n---\n\n# Golden_Man Man Pages Skill\n\nUse when testing the man golden build\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_man command-line tools and their options\n- Look up command syntax and usage patterns\n- Find examples of common command invocations\n- Review available flags and environment variables\n- Explore related commands via SEE ALSO references\n\n## Quick Command Reference\n\n### git-log\n\n```\ngit log [<options>] [<revision-range>] [[--] <path>...]\n```\n\n### git-diff\n\n```\ngit diff [<options>] [<commit>] [--] [<path>...]\n```\n\n## Man Page Overview\n\n**Total Man Pages:** 3\n\n**Content Breakdown:**\n\n- **Git**: 2 man page(s)\n- **Curl**: 1 man page(s)\n\n## Common Options\n\n*3 options extracted across all man pages*\n\n### git-log\n\n- `-p` -- Generate patch output.\n- `--max-count=<number>` -- Limit the number of commits to output, interacting subtly with pathspec filtering, history simplification, and the --fol...\n\n### curl\n\n- `-s, --silent` -- Silent mode.\n\n## Examples\n\n*3 example(s) extracted from man pages*\n\n### git-log\n\nShow the last three commits\n\n```bash\ngit log -3\n```\n\n### git-log\n\nProse-only example with no command\n\n### curl\n\nFetch a page\n\n```bash\ncurl https://example.com\n```\n\n## Related Commands (SEE ALSO)\n\n- `git-diff`\n- `git-log`\n- `gitk`\n\n## Documentation Statistics\n\n- **Total Man Pages**: 3\n- **Total Options**: 3\n- **Total Examples**: 3\n- **Cross-references**: 3\n\n## Navigation\n\n**Reference Files:**\n\n- `references/git_01.md` -- Git\n- `references/curl_02.md` -- Curl\n\nSee `references/index.md` for complete reference structure.\n\n---\n\n**Generated by Skill Seekers** | Man Page Scraper\n\n<!-- File: tests/golden/phase2/pdf_chapters/SKILL.md (Tokens: ~817 | Category: anthropic-skill) -->\n---\nname: golden-pdf-ch\ndescription: Use when testing chapter categorization\n---\n\n# Golden_Pdf_Ch Documentation Skill\n\nUse when testing chapter categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pdf_ch concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Chapter Overview\n\n**Total Pages:** 4\n\n**Content Breakdown:**\n\n- **Chapter 1: Basics**: 2 pages\n- **Chapter 2: Advanced**: 1 pages\n- **Additional Content**: 1 pages\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (page 1)\n\n**Installation** (1 sections):\n- Installation Steps (page 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (page 3)\n\n**Usage** (1 sections):\n- API Usage (page 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Documentation Statistics\n\n- **Total Pages**: 4\n- **Code Blocks**: 4\n- **Images/Diagrams**: 2\n- **Programming Languages**: 3\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n- text: 1 examples\n\n**Code Quality:**\n\n- Average Quality Score: 7.4/10\n- Valid Code Blocks: 4\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_p1-p2.md` - Chapter 1: Basics\n- `references/section_p3-p3.md` - Chapter 2: Advanced\n- `references/section_p4-p4.md` - Additional Content\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | PDF Documentation Scraper\n\n<!-- File: tests/golden/phase2/pdf_kw/SKILL.md (Tokens: ~821 | Category: anthropic-skill) -->\n---\nname: golden-pdf-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Pdf_Kw Documentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pdf_kw concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Chapter Overview\n\n**Total Pages:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 pages\n- **Api**: 1 pages\n- **Deployment**: 0 pages\n- **Other**: 1 pages\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (page 1)\n\n**Installation** (1 sections):\n- Installation Steps (page 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (page 3)\n\n**Usage** (1 sections):\n- API Usage (page 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Documentation Statistics\n\n- **Total Pages**: 3\n- **Code Blocks**: 4\n- **Images/Diagrams**: 2\n- **Programming Languages**: 3\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n- text: 1 examples\n\n**Code Quality:**\n\n- Average Quality Score: 7.4/10\n- Valid Code Blocks: 4\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_p1-p1.md` - Setup\n- `references/section_p2-p2.md` - Api\n- `references/section_03.md` - Deployment\n- `references/section_p3-p3.md` - Other\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | PDF Documentation Scraper\n\n<!-- File: tests/golden/phase2/pdf/SKILL.md (Tokens: ~749 | Category: anthropic-skill) -->\n---\nname: golden-pdf\ndescription: Use when testing the pdf golden build\n---\n\n# Golden_Pdf Documentation Skill\n\nUse when testing the pdf golden build\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pdf concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Chapter Overview\n\n**Total Pages:** 3\n\n**Content Breakdown:**\n\n- **manual**: 3 pages\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (page 1)\n\n**Installation** (1 sections):\n- Installation Steps (page 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (page 3)\n\n**Usage** (1 sections):\n- API Usage (page 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Documentation Statistics\n\n- **Total Pages**: 3\n- **Code Blocks**: 4\n- **Images/Diagrams**: 2\n- **Programming Languages**: 3\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n- text: 1 examples\n\n**Code Quality:**\n\n- Average Quality Score: 7.4/10\n- Valid Code Blocks: 4\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/manual.md` - manual\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | PDF Documentation Scraper\n\n<!-- File: tests/golden/phase2/pptx_kw/SKILL.md (Tokens: ~855 | Category: anthropic-skill) -->\n---\nname: golden-pptx-kw\ndescription: Use when testing keyword categorization\n---\n\n# Golden_Pptx_Kw Presentation Skill\n\nUse when testing keyword categorization\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pptx_kw concepts and fundamentals\n- Review presentation content and key points\n- Find code examples and implementation patterns\n- Access speaker notes and additional context\n- Reference tables and data from the presentation\n\n## 📖 Section Overview\n\n**Total Slides:** 8\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **Setup**: 1 sections\n- **Api**: 1 sections\n- **Other**: 1 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this presentation*\n\n**Major Sections:**\n\n- Getting Started Guide\n- Architecture Overview\n- Summary and Q&A\n\n**Slide Topics:**\n\n- Slide 2: Verify Setup\n- Slide 3: First Demo\n- Slide 8: Common Errors\n\n## ⚡ Quick Reference\n\n*Common presentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Overview** (1 sections):\n- Architecture Overview (section 2)\n\n**Summary** (1 sections):\n- Summary and Q&A (section 3)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from presentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in presentation*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: Architecture Overview**\n\n## 📊 Presentation Statistics\n\n- **Total Slides**: 8\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/section_s1-s1.md` - Setup\n- `references/section_s2-s2.md` - Api\n- `references/section_s3-s3.md` - Other\n\nSee `references/index.md` for complete presentation structure.\n\n---\n\n**Generated by Skill Seeker** | PowerPoint Presentation Scraper\n\n<!-- File: tests/golden/phase2/pptx/SKILL.md (Tokens: ~845 | Category: anthropic-skill) -->\n---\nname: golden-pptx\ndescription: Use when testing the pptx golden build\n---\n\n# Golden_Pptx Presentation Skill\n\nUse when testing the pptx golden build\n\n## 📋 Presentation Information\n\n**Title:** The Deck\n\n**Author:** Jane Doe\n\n**Subject:** Quarterly architecture review\n\n**Category:** Engineering\n\n**Created:** 2024-01-01\n\n**Modified:** 2024-03-03\n\n**Slides:** 8\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_pptx concepts and fundamentals\n- Review presentation content and key points\n- Find code examples and implementation patterns\n- Access speaker notes and additional context\n- Reference tables and data from the presentation\n\n## 📖 Section Overview\n\n**Total Slides:** 8\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **deck**: 3 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this presentation*\n\n**Major Sections:**\n\n- Getting Started Guide\n- Summary and Q&A\n\n**Subsections:**\n\n- Installation Steps\n- Architecture Overview\n\n## ⚡ Quick Reference\n\n*Common presentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Overview** (1 sections):\n- Architecture Overview (section 2)\n\n**Summary** (1 sections):\n- Summary and Q&A (section 3)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from presentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in presentation*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: Architecture Overview**\n\n## 📊 Presentation Statistics\n\n- **Total Slides**: 8\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 2\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/deck.md` - deck\n\nSee `references/index.md` for complete presentation structure.\n\n---\n\n**Generated by Skill Seeker** | PowerPoint Presentation Scraper\n\n<!-- File: tests/golden/phase2/rss_empty/SKILL.md (Tokens: ~267 | Category: anthropic-skill) -->\n---\nname: golden-rss-empty\ndescription: Use when testing the empty rss golden build\n---\n\n# Quiet Feed Feed Skill\n\nUse when testing the empty rss golden build\n\n## 📡 Feed Information\n\n**Feed Title:** Quiet Feed\n\n**Feed Type:** Atom\n\n**Website:** https://example.com/quiet\n\n**Description:** A feed with no entries yet.\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Reference articles and content from Quiet Feed\n- Look up specific topics covered in the feed\n- Find author perspectives and expert analysis\n- Review recent posts and updates on the subject\n- Explore categorized content by tags or topics\n\n## 📖 Article Overview\n\n**Total Articles:** 0\n\n**Content by Category:**\n\n- **All Articles**: 0 articles\n\n## 📊 Feed Statistics\n\n- **Total Articles**: 0\n- **Feed Type**: Atom\n- **Categories/Tags**: 0\n- **Authors**: 0\n- **Full Content Scraped**: No\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/all_articles.md` - All Articles (0 articles)\n\nSee `references/index.md` for complete feed structure.\n\n---\n\n**Generated by Skill Seeker** | RSS/Atom Feed Scraper\n\n<!-- File: tests/golden/phase2/rss/SKILL.md (Tokens: ~867 | Category: anthropic-skill) -->\n---\nname: golden-rss\ndescription: Use when testing the rss golden build\n---\n\n# Example Engineering Blog Feed Skill\n\nUse when testing the rss golden build\n\n## 📡 Feed Information\n\n**Feed Title:** Example Engineering Blog\n\n**Feed Type:** RSS 2.0\n\n**Website:** https://example.com\n\n**Language:** en-us\n\n**Description:** A feed description that is intentionally longer than the three hundred character limit applied in the Feed Information block of SKILL.md. A feed description that is intentionally longer than the three hundred character limit applied in the Feed Information block of SKILL.md. A feed description th...\n\n**Generator:** ExampleCMS 2.0\n\n**Rights:** © Example Inc.\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Reference articles and content from Example Engineering Blog\n- Look up specific topics covered in the feed\n- Find author perspectives and expert analysis\n- Review recent posts and updates on the subject\n- Explore categorized content by tags or topics\n\n## 📖 Article Overview\n\n**Total Articles:** 4\n\n**Content by Category:**\n\n- **Dev Ops**: 1 articles\n- **Python**: 1 articles\n- **uncategorized**: 1 articles\n- **★★★**: 1 articles\n\n## 📰 Recent Articles\n\n### Continuous Delivery in Practice\n\n**Published:** Mon, 01 Jan 2024 10:00:00 GMT | **Author:** Jane Doe\n\nThis is a deliberately long summary that keeps going well past the two hundred character truncation threshold used by the recent-articles block of SKILL.md so that the shortened form with a trailing e...\n\n[Read more](https://example.com/posts/cd-in-practice)\n\n### Typing Tips for Python\n\n**Published:** Fri, 15 Mar 2024 08:30:00 GMT | **Author:** John Roe\n\nShort notes on gradual typing.\n\n[Read more](https://example.com/posts/typing-tips)\n\n### An Uncategorized Note\n\n**Author:** Jane Doe\n\nA note without tags.\n\n### Symbols Only\n\n**Published:** Sat, 10 Feb 2024 12:00:00 GMT\n\n[Read more](https://example.com/posts/symbols)\n\n## ✍️ Authors (2)\n\n- **Jane Doe**: 2 articles\n- **John Roe**: 1 articles\n\n## 🏷️ Tags (55)\n\n`Dev Ops`, `Python`, `dev-ops`, `tag00`, `tag01`, `tag02`, `tag03`, `tag04`, `tag05`, `tag06`, `tag07`, `tag08`, `tag09`, `tag10`, `tag11`, `tag12`, `tag13`, `tag14`, `tag15`, `tag16`, `tag17`, `tag18`, `tag19`, `tag20`, `tag21`, `tag22`, `tag23`, `tag24`, `tag25`, `tag26`, `tag27`, `tag28`, `tag29`, `tag30`, `tag31`, `tag32`, `tag33`, `tag34`, `tag35`, `tag36`, `tag37`, `tag38`, `tag39`, `tag40`, `tag41`, `tag42`, `tag43`, `tag44`, `tag45`, `tag46` ... and 5 more\n\n## 📊 Feed Statistics\n\n- **Total Articles**: 4\n- **Feed Type**: RSS 2.0\n- **Categories/Tags**: 55\n- **Authors**: 2\n- **Full Content Scraped**: Yes\n\n- **Date Range**: 2024-01-01 to 2024-03-15\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/dev_ops.md` - Dev Ops (1 articles)\n- `references/python.md` - Python (1 articles)\n- `references/uncategorized.md` - uncategorized (1 articles)\n- `references/unnamed.md` - ★★★ (1 articles)\n\nSee `references/index.md` for complete feed structure.\n\n---\n\n**Generated by Skill Seeker** | RSS/Atom Feed Scraper\n\n<!-- File: tests/golden/phase2/word/SKILL.md (Tokens: ~806 | Category: anthropic-skill) -->\n---\nname: golden-word\ndescription: Use when testing the word golden build\n---\n\n# Golden_Word Documentation Skill\n\nUse when testing the word golden build\n\n## 📋 Document Information\n\n**Title:** The Manual\n\n**Author:** John Roe\n\n**Created:** 2023-05-05\n\n**Modified:** 2024-02-02\n\n## 💡 When to Use This Skill\n\nUse this skill when you need to:\n- Understand golden_word concepts and fundamentals\n- Look up API references and technical specifications\n- Find code examples and implementation patterns\n- Review tutorials, guides, and best practices\n- Explore the complete documentation structure\n\n## 📖 Section Overview\n\n**Total Sections:** 3\n\n**Content Breakdown:**\n\n- **manual**: 3 sections\n\n## 🔑 Key Concepts\n\n*Main topics covered in this documentation*\n\n**Major Topics:**\n\n- Getting Started Guide\n- Troubleshooting\n\n**Subtopics:**\n\n- Installation Steps\n- API Usage\n- Common Errors\n\n## ⚡ Quick Reference\n\n*Common documentation patterns found:*\n\n**Getting Started** (1 sections):\n- Getting Started Guide (section 1)\n\n**Troubleshooting** (1 sections):\n- Troubleshooting (section 3)\n\n**Usage** (1 sections):\n- API Usage (section 2)\n\n## 📝 Code Examples\n\n*High-quality examples extracted from documentation*\n\n### Bash Examples (1)\n\n**Example 1** (Quality: 6.0/10):\n\n```bash\npip install thing\n```\n\n### Python Examples (2)\n\n**Example 1** (Quality: 9.5/10):\n\n```python\ndef long_example():\n    x0 = 0\n    x1 = 1\n    x2 = 2\n    x3 = 3\n    x4 = 4\n    x5 = 5\n    x6 = 6\n    x7 = 7\n    x8 = 8\n    x9 = 9\n    x10 = 10\n    x11 = 11\n    x12 = 12\n    x13 = 13\n    x14 = 14\n    x15 = 15\n    x16 = 16\n    x17 = 17\n    x18 = 18\n    x19 = 19\n    x20 = 20\n    x21 = 21\n    x22 = 22\n    x23 = 23\n    x24 = 24\n    x25 = 25\n    x26 = 26\n    x27 = 27\n    x28 = 28\n    x29 = 29\n    x30 = 30\n    x31 = 31\n    x32 = 32\n    x33 = 33\n    x34 = 34\n    x35 = 35\n    x36 = 36\n    x37 = 37\n    x3\n...\n```\n\n**Example 2** (Quality: 8.5/10):\n\n```python\nprint('hello')\n```\n\n## 📊 Table Summary\n\n*2 table(s) found in document*\n\n**From section: Getting Started Guide**\n\n| Option | Default |\n| --- | --- |\n| debug | false |\n| port | 8080 |\n\n**From section: API Usage**\n\n## 📊 Documentation Statistics\n\n- **Total Sections**: 3\n- **Code Blocks**: 3\n- **Images/Diagrams**: 1\n- **Tables**: 2\n- **Programming Languages**: 2\n\n**Language Breakdown:**\n\n- python: 2 examples\n- bash: 1 examples\n\n## 🗺️ Navigation\n\n**Reference Files:**\n\n- `references/manual.md` - manual\n\nSee `references/index.md` for complete documentation structure.\n\n---\n\n**Generated by Skill Seeker** | Word Document Scraper\n\n<!-- File: docs/agents/plans/2026-03-14-epub-input-support.md (Tokens: ~10908 | Category: subagent-persona) -->\n---\ndate: 2026-03-14T19:30:35.172407+00:00\ngit_commit: 7c90a4b9c9bccac8341b0769550d77aae3b4e524\nbranch: development\ntopic: \"Add EPUB Input Support\"\ntags: [plan, epub, scraper, input-format]\nstatus: complete\n---\n\n> 🗄️ **Historical — completed** — This plan was fully executed. EPUB input support is live in Skill Seekers v3.6.0 (`epub_scraper.py`, `arguments/epub.py`, `parsers/epub_parser.py`, 107+ tests).\n\n# Add EPUB Input Support — Implementation Plan\n\n## Overview\n\nAdd `.epub` as an input format for Skill Seekers, enabling `skill-seekers create book.epub` and `skill-seekers epub --epub book.epub`. Follows the established Word/PDF scraper pattern: source detection → routing → extraction → categorize → build skill.\n\n**Authoritative reference**: [W3C EPUB 3.3 Specification](https://www.w3.org/TR/epub-33/) (also covers EPUB 2 backward compatibility).\n\n## Current State Analysis\n\nThe codebase has a consistent multi-layer architecture for document input formats. PDF and Word (.docx) serve as direct analogs. The Word scraper (`word_scraper.py`) is the closest pattern match since both Word and EPUB produce HTML/XHTML that is parsed with BeautifulSoup.\n\n### Key Discoveries:\n- Word scraper converts `.docx` → HTML (via mammoth) → BeautifulSoup parse → intermediate JSON → SKILL.md (`word_scraper.py:96-235`)\n- EPUB files contain XHTML natively (per W3C spec §5), so the mammoth conversion step is unnecessary — BeautifulSoup can parse EPUB XHTML content directly\n- Source detection uses file extension matching (`source_detector.py:57-65`)\n- Optional dependencies use a guard pattern with `try/except ImportError` and a `_check_*_deps()` function (`word_scraper.py:21-40`)\n- The `ebooklib` library (v0.18+) provides `epub.read_epub()` returning an `EpubBook` with spine iteration, metadata access via `get_metadata('DC', key)`, and item content via `get_content()`/`get_body_content()`\n- ebooklib has a known bug: EPUB 3 files read TOC from NCX instead of NAV (issue #200); workaround: `options={\"ignore_ncx\": True}`\n- ebooklib loads entire EPUB into memory — acceptable for typical books but relevant for edge cases\n\n## Desired End State\n\nRunning `skill-seekers create book.epub` produces:\n```\noutput/book/\n├── SKILL.md              # Main skill file with metadata, concepts, code examples\n├── references/\n│   ├── index.md          # Category index with statistics\n│   └── book.md           # Chapter content (or multiple files if categorized)\n├── scripts/\n└── assets/\n    └── *.png|*.jpg       # Extracted images\n```\n\n### CLI Output Mockup\n\n```\n$ skill-seekers create programming-rust.epub\n\nℹ️  Detected source type: epub\nℹ️  Routing to epub scraper...\n\n🔍 Extracting from EPUB: programming-rust.epub\n   Title: Programming Rust, 2nd Edition\n   Author: Jim Blandy, Jason Orendorff\n   Language: en\n   Chapters: 23 (spine items)\n\n📄 Processing chapters...\n   Chapter 1/23: Why Rust? (2 sections, 1 code block)\n   Chapter 2/23: A Tour of Rust (5 sections, 12 code blocks)\n   ...\n   Chapter 23/23: Macros (4 sections, 8 code blocks)\n\n📊 Extraction complete:\n   Sections: 142\n   Code blocks: 287 (Rust: 245, Shell: 28, TOML: 14)\n   Images: 34\n   Tables: 12\n\n💾 Saved extracted data to: output/programming-rust_extracted.json\n\n📋 Categorizing content...\n✅ Created 1 category (single EPUB source)\n   - programming-rust: 142 sections\n\n📝 Generating reference files...\n   Generated: output/programming-rust/references/programming-rust.md\n   Generated: output/programming-rust/references/index.md\n\n✅ Skill built successfully: output/programming-rust/\n\n📦 Next step: Package with: skill-seekers package output/programming-rust/\n```\n\n### Verification:\n- [x] `skill-seekers create book.epub` produces valid output directory\n- [x] `skill-seekers create book.epub --name mybook` works standalone\n- [x] `skill-seekers create book.epub --dry-run` shows config without processing\n- [x] All ~2,540+ existing tests still pass (982 passed, 1 pre-existing failure)\n- [x] New test suite has 100+ tests covering happy path, errors, and edge cases (107 tests, 14 classes)\n\n## What We're NOT Doing\n\n- DRM decryption (detect and error gracefully with clear message)\n- EPUB writing/creation (read-only)\n- Media overlay / audio / video extraction (ignore gracefully)\n- Fixed-layout OCR (detect and warn; extract whatever text exists in XHTML)\n- `--chapter-range` flag (can be added later)\n- Unified scraper (`unified_scraper.py`) EPUB support (separate future task)\n- MCP tool for EPUB (separate future task)\n\n## Implementation Approach\n\nFollow the Word scraper pattern exactly, with EPUB-specific extraction logic:\n\n1. **Phase 1**: Core `epub_scraper.py` — the `EpubToSkillConverter` class\n2. **Phase 2**: CLI integration — source detection, arguments, parser, routing, entry points\n3. **Phase 3**: Comprehensive test suite — 100+ tests across 11 test classes\n4. **Phase 4**: Documentation updates\n\n---\n\n## Phase 1: Core EPUB Scraper\n\n### Overview\nCreate `epub_scraper.py` with `EpubToSkillConverter` class following the Word scraper pattern. This is the bulk of new code.\n\n### Changes Required:\n\n#### [x] 1. Optional dependency in pyproject.toml\n**File**: `pyproject.toml`\n**Changes**: Add `epub` optional dependency group and include in `all` group\n\n```toml\n# After the docx group (~line 115)\n# EPUB (.epub) support\nepub = [\n    \"ebooklib>=0.18\",\n]\n```\n\nAdd `\"ebooklib>=0.18\",` to the `all` group (~line 178).\n\n#### [x] 2. Create `src/skill_seekers/cli/epub_scraper.py`\n**File**: `src/skill_seekers/cli/epub_scraper.py` (new)\n**Changes**: Full EPUB scraper module\n\n**Structure** (following `word_scraper.py` pattern):\n\n```python\n\"\"\"\nEPUB Documentation to Skill Converter\n\nConverts EPUB e-books into skills.\nUses ebooklib for EPUB parsing, BeautifulSoup for XHTML content extraction.\n\nUsage:\n    skill-seekers create book.epub --name myskill\n    skill-seekers create book_extracted.json\n\"\"\"\n\nimport argparse\nimport json\nimport logging\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n# Optional dependency guard\ntry:\n    import ebooklib\n    from ebooklib import epub\n    EPUB_AVAILABLE = True\nexcept ImportError:\n    EPUB_AVAILABLE = False\n\n# BeautifulSoup is a core dependency (always available)\nfrom bs4 import BeautifulSoup, Comment\n\nlogger = logging.getLogger(__name__)\n\n\ndef _check_epub_deps():\n    \"\"\"Raise RuntimeError if ebooklib is not installed.\"\"\"\n    if not EPUB_AVAILABLE:\n        raise RuntimeError(\n            \"ebooklib is required for EPUB support.\\n\"\n            'Install with: pip install \"skill-seekers[epub]\"\\n'\n            \"Or: pip install ebooklib\"\n        )\n\n\ndef infer_description_from_epub(metadata: dict | None = None, name: str = \"\") -> str:\n    \"\"\"Infer skill description from EPUB metadata.\"\"\"\n    if metadata:\n        if metadata.get(\"description\") and len(metadata[\"description\"]) > 20:\n            desc = metadata[\"description\"].strip()\n            if len(desc) > 150:\n                desc = desc[:147] + \"...\"\n            return f\"Use when {desc.lower()}\"\n        if metadata.get(\"title\") and len(metadata[\"title\"]) > 10:\n            return f\"Use when working with {metadata['title'].lower()}\"\n    return (\n        f\"Use when referencing {name} documentation\"\n        if name\n        else \"Use when referencing this documentation\"\n    )\n```\n\n**`EpubToSkillConverter` class methods:**\n\n```python\nclass EpubToSkillConverter:\n    def __init__(self, config: dict):\n        self.config = config\n        self.name = config[\"name\"]\n        self.epub_path = config.get(\"epub_path\", \"\")\n        self.description = config.get(\n            \"description\", f\"Use when referencing {self.name} documentation\"\n        )\n        self.skill_dir = f\"output/{self.name}\"\n        self.data_file = f\"output/{self.name}_extracted.json\"\n        self.categories = config.get(\"categories\", {})\n        self.extracted_data = None\n\n    def extract_epub(self) -> bool:\n        \"\"\"Extract content from EPUB file.\n\n        Workflow:\n        1. Check dependencies (ebooklib)\n        2. Detect DRM via META-INF/encryption.xml (fail fast)\n        3. Read EPUB via ebooklib with ignore_ncx=True (EPUB 3 TOC bug workaround)\n        4. Extract Dublin Core metadata (title, creator, language, publisher, date, description, subject)\n        5. Iterate spine items in reading order\n        6. For each ITEM_DOCUMENT: parse XHTML with BeautifulSoup\n        7. Split by h1/h2 heading boundaries into sections\n        8. Extract code blocks from <pre>/<code> elements\n        9. Extract images from EpubImage items\n        10. Detect code languages via LanguageDetector\n        11. Save intermediate JSON to {name}_extracted.json\n\n        Returns True on success.\n        Raises RuntimeError for DRM-protected files.\n        Raises FileNotFoundError for missing files.\n        Raises ValueError for invalid EPUB files.\n        \"\"\"\n```\n\n**DRM detection** (per W3C spec §4.2.6.3.2):\n\n```python\ndef _detect_drm(self, book) -> bool:\n    \"\"\"Detect DRM by checking for encryption.xml with non-font-obfuscation entries.\n\n    Per W3C EPUB 3.3 spec: encryption.xml is present when resources are encrypted.\n    Font obfuscation (IDPF algorithm http://www.idpf.org/2008/embedding or\n    Adobe algorithm http://ns.adobe.com/pdf/enc#RC) is NOT DRM — only font mangling.\n\n    Actual DRM uses algorithms like:\n    - Adobe ADEPT: http://ns.adobe.com/adept namespace\n    - Apple FairPlay: http://itunes.apple.com/dataenc\n    - Readium LCP: http://readium.org/2014/01/lcp\n    \"\"\"\n```\n\n**Metadata extraction** (per W3C spec §5.2, Dublin Core):\n\n```python\ndef _extract_metadata(self, book) -> dict:\n    \"\"\"Extract Dublin Core metadata from EPUB.\n\n    Per W3C EPUB 3.3 spec: required elements are dc:identifier, dc:title, dc:language.\n    Optional: dc:creator, dc:contributor, dc:date, dc:description, dc:publisher,\n    dc:subject, dc:rights, dc:type, dc:coverage, dc:source, dc:relation, dc:format.\n\n    ebooklib API: book.get_metadata('DC', key) returns list of (value, attrs) tuples.\n    \"\"\"\n    def _get_one(key):\n        data = book.get_metadata('DC', key)\n        return data[0][0] if data else None\n\n    def _get_list(key):\n        data = book.get_metadata('DC', key)\n        return [x[0] for x in data] if data else []\n\n    return {\n        \"title\": _get_one('title') or \"Untitled\",\n        \"author\": \", \".join(_get_list('creator')) or None,\n        \"language\": _get_one('language') or \"en\",\n        \"publisher\": _get_one('publisher'),\n        \"date\": _get_one('date'),\n        \"description\": _get_one('description'),\n        \"subject\": \", \".join(_get_list('subject')) or None,\n        \"rights\": _get_one('rights'),\n        \"identifier\": _get_one('identifier'),\n    }\n```\n\n**Content extraction** (per W3C spec §5 — XHTML Content Documents use XML serialization of HTML5):\n\n```python\ndef _extract_spine_content(self, book) -> list[dict]:\n    \"\"\"Extract content from spine items in reading order.\n\n    Per W3C EPUB 3.3 spec §3.4.8: spine defines ordered list of content documents.\n    Linear=\"yes\" (default) items form the primary reading order.\n    Linear=\"no\" items are auxiliary (footnotes, glossary).\n\n    Per spec §5: XHTML content documents use XML syntax of HTML5.\n    Parse with BeautifulSoup, split by h1/h2 heading boundaries.\n    \"\"\"\n    sections = []\n    section_number = 0\n\n    for item_id, linear in book.spine:\n        item = book.get_item_with_id(item_id)\n        if not item or item.get_type() != ebooklib.ITEM_DOCUMENT:\n            continue\n\n        soup = BeautifulSoup(item.get_content(), 'html.parser')\n\n        # Remove scripts, styles, comments (not useful for text extraction)\n        for tag in soup(['script', 'style']):\n            tag.decompose()\n        for comment in soup.find_all(string=lambda t: isinstance(t, Comment)):\n            comment.extract()\n\n        body = soup.find('body')\n        if not body:\n            continue\n\n        # Split by h1/h2 heading boundaries (same as word_scraper)\n        # Each heading starts a new section\n        ...\n```\n\n**Image extraction** (per W3C spec §3.3 — core media types include JPEG, PNG, GIF, WebP, SVG):\n\n```python\ndef _extract_images(self, book) -> list[dict]:\n    \"\"\"Extract images from EPUB manifest.\n\n    Per W3C EPUB 3.3 spec §3.3: core image media types are\n    image/gif, image/jpeg, image/png, image/svg+xml, image/webp.\n\n    ebooklib API: book.get_items_of_type(ebooklib.ITEM_IMAGE)\n    returns EpubImage items with get_content() (bytes) and media_type.\n\n    SVG images (ITEM_VECTOR) handled separately.\n    \"\"\"\n```\n\n**The remaining methods** (`categorize_content`, `build_skill`, `_generate_reference_file`, `_generate_index`, `_generate_skill_md`, `_format_key_concepts`, `_format_patterns_from_content`, `_sanitize_filename`) follow the Word scraper pattern exactly — they operate on the same intermediate JSON structure.\n\n**`main()` function** (following `word_scraper.py:923-1059`):\n\n```python\ndef main():\n    from .arguments.epub import add_epub_arguments\n\n    parser = argparse.ArgumentParser(\n        description=\"Convert EPUB e-book to skill\",\n        formatter_class=argparse.RawDescriptionHelpFormatter,\n    )\n    add_epub_arguments(parser)\n    args = parser.parse_args()\n\n    # Logging setup\n    if getattr(args, \"quiet\", False):\n        logging.getLogger().setLevel(logging.WARNING)\n    elif getattr(args, \"verbose\", False):\n        logging.getLogger().setLevel(logging.DEBUG)\n\n    # Dry run\n    if getattr(args, \"dry_run\", False):\n        source = args.epub or args.from_json or \"(none)\"\n        print(f\"\\n{'=' * 60}\")\n        print(\"DRY RUN: EPUB Extraction\")\n        print(f\"{'=' * 60}\")\n        print(f\"Source:         {source}\")\n        print(f\"Name:           {getattr(args, 'name', None) or '(auto-detect)'}\")\n        print(f\"Enhance level:  {getattr(args, 'enhance_level', 0)}\")\n        print(f\"\\n✅ Dry run complete\")\n        return\n\n    # Validate inputs\n    if not (args.epub or args.from_json):\n        parser.error(\"Must specify --epub or --from-json\")\n\n    # From-JSON workflow\n    if args.from_json:\n        name = Path(args.from_json).stem.replace(\"_extracted\", \"\")\n        config = {\n            \"name\": name,\n            \"description\": args.description or f\"Use when referencing {name} documentation\",\n        }\n        converter = EpubToSkillConverter(config)\n        converter.load_extracted_data(args.from_json)\n        converter.build_skill()\n        return\n\n    # Direct EPUB workflow\n    name = args.name or Path(args.epub).stem\n    config = {\n        \"name\": name,\n        \"epub_path\": args.epub,\n        \"description\": args.description or f\"Use when referencing {name} documentation\",\n    }\n\n    try:\n        converter = EpubToSkillConverter(config)\n        if not converter.extract_epub():\n            print(\"\\n❌ EPUB extraction failed\", file=sys.stderr)\n            sys.exit(1)\n        converter.build_skill()\n\n        # Enhancement workflow integration\n        from skill_seekers.cli.workflow_runner import run_workflows\n        run_workflows(args)\n\n        # Traditional enhancement\n        if getattr(args, \"enhance_level\", 0) > 0:\n            # Same pattern as word_scraper.py and pdf_scraper.py\n            ...\n\n    except RuntimeError as e:\n        print(f\"\\n❌ Error: {e}\", file=sys.stderr)\n        sys.exit(1)\n```\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `ruff check src/skill_seekers/cli/epub_scraper.py` passes\n- [x] `ruff format --check src/skill_seekers/cli/epub_scraper.py` passes\n- [ ] `mypy src/skill_seekers/cli/epub_scraper.py` passes (continue-on-error)\n- [x] `pip install -e \".[epub]\"` installs successfully\n\n#### Manual Verification:\n- [x] Verify `import ebooklib` works after install\n- [x] Review epub_scraper.py structure matches word_scraper.py pattern\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding to the next phase.\n\n---\n\n## Phase 2: CLI Integration\n\n### Overview\nWire the EPUB scraper into the CLI: source detection, argument definitions, parser registration, create command routing, and entry points.\n\n### Changes Required:\n\n#### [x] 1. Source detection\n**File**: `src/skill_seekers/cli/source_detector.py`\n**Changes**: Add `.epub` extension detection, `_detect_epub()` method, validation, and error message update\n\nAdd after the `.docx` check (line 64):\n```python\nif source.endswith(\".epub\"):\n    return cls._detect_epub(source)\n```\n\nAdd `_detect_epub()` method (following `_detect_word()` at line 124):\n```python\n@classmethod\ndef _detect_epub(cls, source: str) -> SourceInfo:\n    \"\"\"Detect EPUB file source.\"\"\"\n    name = os.path.splitext(os.path.basename(source))[0]\n    return SourceInfo(\n        type=\"epub\", parsed={\"file_path\": source}, suggested_name=name, raw_input=source\n    )\n```\n\nAdd epub validation in `validate_source()` (after word block at line 278):\n```python\nelif source_info.type == \"epub\":\n    file_path = source_info.parsed[\"file_path\"]\n    if not os.path.exists(file_path):\n        raise ValueError(f\"EPUB file does not exist: {file_path}\")\n    if not os.path.isfile(file_path):\n        raise ValueError(f\"Path is not a file: {file_path}\")\n```\n\nAdd EPUB example to the ValueError message (line 94):\n```python\n\"  EPUB:  skill-seekers create ebook.epub\\n\"\n```\n\n#### [x] 2. Argument definitions\n**File**: `src/skill_seekers/cli/arguments/epub.py` (new)\n**Changes**: EPUB-specific argument definitions\n\n```python\n\"\"\"EPUB-specific CLI arguments.\"\"\"\n\nimport argparse\nfrom typing import Any\n\nfrom .common import add_all_standard_arguments\n\nEPUB_ARGUMENTS: dict[str, dict[str, Any]] = {\n    \"epub\": {\n        \"flags\": (\"--epub\",),\n        \"kwargs\": {\n            \"type\": str,\n            \"help\": \"Direct EPUB file path\",\n            \"metavar\": \"PATH\",\n        },\n    },\n    \"from_json\": {\n        \"flags\": (\"--from-json\",),\n        \"kwargs\": {\n            \"type\": str,\n            \"help\": \"Build skill from extracted JSON\",\n            \"metavar\": \"FILE\",\n        },\n    },\n}\n\n\ndef add_epub_arguments(parser: argparse.ArgumentParser) -> None:\n    \"\"\"Add EPUB-specific arguments to parser.\"\"\"\n    add_all_standard_arguments(parser)\n\n    # Override enhance-level default to 0 for EPUB\n    for action in parser._actions:\n        if hasattr(action, \"dest\") and action.dest == \"enhance_level\":\n            action.default = 0\n            action.help = (\n                \"AI enhancement level (auto-detects API vs LOCAL mode): \"\n                \"0=disabled (default for EPUB), 1=SKILL.md only, \"\n                \"2=+architecture/config, 3=full enhancement. \"\n                \"Mode selection: uses API if ANTHROPIC_API_KEY is set, \"\n                \"otherwise LOCAL (Claude Code)\"\n            )\n\n    for arg_name, arg_def in EPUB_ARGUMENTS.items():\n        parser.add_argument(*arg_def[\"flags\"], **arg_def[\"kwargs\"])\n```\n\n#### [x] 3. Create command argument integration\n**File**: `src/skill_seekers/cli/arguments/create.py`\n**Changes**: Add EPUB_ARGUMENTS dict, register in helper functions, add mode handling\n\nAdd after WORD_ARGUMENTS (~line 411):\n```python\n# EPUB specific (from epub.py)\nEPUB_ARGUMENTS: dict[str, dict[str, Any]] = {\n    \"epub\": {\n        \"flags\": (\"--epub\",),\n        \"kwargs\": {\n            \"type\": str,\n            \"help\": \"EPUB file path\",\n            \"metavar\": \"PATH\",\n        },\n    },\n}\n```\n\nAdd to `get_source_specific_arguments()` (line 595):\n```python\n\"epub\": EPUB_ARGUMENTS,\n```\n\nAdd to `add_create_arguments()` (after word block at line 678):\n```python\nif mode in [\"epub\", \"all\"]:\n    for arg_name, arg_def in EPUB_ARGUMENTS.items():\n        parser.add_argument(*arg_def[\"flags\"], **arg_def[\"kwargs\"])\n```\n\n#### [x] 4. Parser class\n**File**: `src/skill_seekers/cli/parsers/epub_parser.py` (new)\n**Changes**: Subcommand parser for standalone `skill-seekers epub` command\n\n```python\n\"\"\"Parser for epub subcommand.\"\"\"\n\nfrom .base import SubcommandParser\nfrom skill_seekers.cli.arguments.epub import add_epub_arguments\n\n\nclass EpubParser(SubcommandParser):\n    \"\"\"Parser for EPUB extraction command.\"\"\"\n\n    @property\n    def name(self) -> str:\n        return \"epub\"\n\n    @property\n    def help(self) -> str:\n        return \"Extract from EPUB e-book (.epub)\"\n\n    @property\n    def description(self) -> str:\n        return \"Extract content from EPUB e-book (.epub) and generate skill\"\n\n    def add_arguments(self, parser):\n        add_epub_arguments(parser)\n```\n\n#### [x] 5. Parser registration\n**File**: `src/skill_seekers/cli/parsers/__init__.py`\n**Changes**: Import and register EpubParser\n\nAdd import (after WordParser import, line 15):\n```python\nfrom .epub_parser import EpubParser\n```\n\nAdd to PARSERS list (after `WordParser()`, line 46):\n```python\nEpubParser(),\n```\n\n#### [x] 6. CLI dispatcher\n**File**: `src/skill_seekers/cli/main.py`\n**Changes**: Add epub to COMMAND_MODULES dict and module docstring\n\nAdd to COMMAND_MODULES (after \"word\" entry, line 52):\n```python\n\"epub\": \"skill_seekers.cli.epub_scraper\",\n```\n\nAdd to module docstring (after \"word\" line, line 15):\n```python\n#    epub                 Extract from EPUB e-book (.epub)\n```\n\n#### [x] 7. Create command routing\n**File**: `src/skill_seekers/cli/create_command.py`\n**Changes**: Add `_route_epub()` method, routing case, help flag, and epilog example\n\nAdd to `_route_to_scraper()` (after word case, line 136):\n```python\nelif self.source_info.type == \"epub\":\n    return self._route_epub()\n```\n\nAdd `_route_epub()` method (after `_route_word()`, line 352):\n```python\ndef _route_epub(self) -> int:\n    \"\"\"Route to EPUB scraper (epub_scraper.py).\"\"\"\n    from skill_seekers.cli import epub_scraper\n\n    argv = [\"epub_scraper\"]\n    file_path = self.source_info.parsed[\"file_path\"]\n    argv.extend([\"--epub\", file_path])\n    self._add_common_args(argv)\n\n    logger.debug(f\"Calling epub_scraper with argv: {argv}\")\n    original_argv = sys.argv\n    try:\n        sys.argv = argv\n        return epub_scraper.main()\n    finally:\n        sys.argv = original_argv\n```\n\nAdd to epilog (line 543, after DOCX example):\n```python\n  EPUB:     skill-seekers create ebook.epub\n```\n\nAdd to Source Auto-Detection section:\n```python\n  • file.epub → EPUB extraction\n```\n\nAdd `--help-epub` flag and handler (after `--help-word` at line 592):\n```python\nparser.add_argument(\n    \"--help-epub\", action=\"store_true\", help=argparse.SUPPRESS, dest=\"_help_epub\"\n)\n```\n\nAdd handler block (after `_help_word` block at line 654):\n```python\nelif args._help_epub:\n    parser_epub = argparse.ArgumentParser(\n        prog=\"skill-seekers create\",\n        description=\"Create skill from EPUB e-book (.epub)\",\n        formatter_class=argparse.RawDescriptionHelpFormatter,\n    )\n    add_create_arguments(parser_epub, mode=\"epub\")\n    parser_epub.print_help()\n    return 0\n```\n\n#### [x] 8. Entry point\n**File**: `pyproject.toml`\n**Changes**: Add standalone entry point\n\nAdd after `skill-seekers-word` (line 224):\n```toml\nskill-seekers-epub = \"skill_seekers.cli.epub_scraper:main\"\n```\n\n#### [x] 9. Positional argument handling in main.py\n**File**: `src/skill_seekers/cli/main.py`\n**Changes**: Add \"input_file\" is already in the positional list at line 153, so no change needed. Verify `_reconstruct_argv` handles epub correctly through the standard delegation path.\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `ruff check src/skill_seekers/cli/source_detector.py src/skill_seekers/cli/arguments/epub.py src/skill_seekers/cli/parsers/epub_parser.py src/skill_seekers/cli/create_command.py` passes\n- [x] `ruff format --check src/skill_seekers/cli/` passes\n- [x] `pip install -e \".[epub]\"` installs with all entry points\n- [x] `skill-seekers create --help` shows EPUB-specific help\n- [x] `skill-seekers create --help-epub` shows EPUB arguments (via standalone entry point `skill-seekers-create`)\n- [x] `skill-seekers create nonexistent.epub` gives clear error about missing file\n- [x] Existing tests still pass: `pytest tests/ -v -x -m \"not slow and not integration\"` (875 passed, 1 pre-existing unrelated failure in test_git_sources_e2e)\n\n#### Manual Verification:\n- [x] `skill-seekers --help` lists `epub` command\n- [x] `skill-seekers create book.epub --dry-run` shows dry run output\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding to the next phase.\n\n---\n\n## Phase 3: Comprehensive Test Suite\n\n### Overview\nCreate `tests/test_epub_scraper.py` with 100+ tests across 11 test classes, covering happy path, negative cases, edge cases, and CLI integration.\n\n### Changes Required:\n\n#### [x] 1. Create test file\n**File**: `tests/test_epub_scraper.py` (new)\n**Changes**: Comprehensive test suite following `test_word_scraper.py` patterns\n\n```python\n\"\"\"\nTests for EPUB scraper (epub_scraper.py).\n\nCovers: initialization, extraction, categorization, skill building,\ncode blocks, tables, images, error handling, JSON workflow, CLI arguments,\nhelper functions, source detection, DRM detection, and edge cases.\n\nTests use mock data and do not require actual EPUB files or ebooklib installed.\n\"\"\"\n\nimport json\nimport os\nimport shutil\nimport tempfile\nimport unittest\nfrom pathlib import Path\nfrom unittest.mock import MagicMock, patch, PropertyMock\n\n\n# Conditional import (same pattern as test_word_scraper.py)\ntry:\n    from skill_seekers.cli.epub_scraper import (\n        EpubToSkillConverter,\n        infer_description_from_epub,\n        _score_code_quality,\n        _check_epub_deps,\n        EPUB_AVAILABLE,\n    )\n    IMPORT_OK = True\nexcept ImportError:\n    IMPORT_OK = False\n```\n\n**Helper factory function:**\n\n```python\ndef _make_sample_extracted_data(\n    num_sections=2,\n    include_code=False,\n    include_tables=False,\n    include_images=False,\n) -> dict:\n    \"\"\"Create minimal extracted_data dict for testing.\"\"\"\n    sections = []\n    total_code = 0\n    total_images = 0\n    languages = {}\n\n    for i in range(1, num_sections + 1):\n        section = {\n            \"section_number\": i,\n            \"heading\": f\"Chapter {i}\",\n            \"heading_level\": \"h1\",\n            \"text\": f\"Content of chapter {i}. This is sample text.\",\n            \"headings\": [{\"level\": \"h2\", \"text\": f\"Section {i}.1\"}],\n            \"code_samples\": [],\n            \"tables\": [],\n            \"images\": [],\n        }\n\n        if include_code:\n            section[\"code_samples\"] = [\n                {\"code\": f\"def func_{i}():\\n    return {i}\", \"language\": \"python\", \"quality_score\": 7.5},\n                {\"code\": f\"console.log({i})\", \"language\": \"javascript\", \"quality_score\": 4.0},\n            ]\n            total_code += 2\n            languages[\"python\"] = languages.get(\"python\", 0) + 1\n            languages[\"javascript\"] = languages.get(\"javascript\", 0) + 1\n\n        if include_tables:\n            section[\"tables\"] = [\n                {\"headers\": [\"Name\", \"Value\"], \"rows\": [[\"key\", \"val\"]]}\n            ]\n\n        if include_images:\n            section[\"images\"] = [\n                {\"index\": 1, \"data\": b\"\\x89PNG\\r\\n\\x1a\\n\", \"width\": 100, \"height\": 100}\n            ]\n            total_images += 1\n\n        sections.append(section)\n\n    return {\n        \"source_file\": \"test.epub\",\n        \"metadata\": {\n            \"title\": \"Test Book\",\n            \"author\": \"Test Author\",\n            \"language\": \"en\",\n            \"publisher\": \"Test Publisher\",\n            \"date\": \"2024-01-01\",\n            \"description\": \"A test book for unit testing\",\n            \"subject\": \"Testing, Unit Tests\",\n            \"rights\": \"Copyright 2024\",\n            \"identifier\": \"urn:uuid:12345\",\n        },\n        \"total_sections\": num_sections,\n        \"total_code_blocks\": total_code,\n        \"total_images\": total_images,\n        \"languages_detected\": languages,\n        \"pages\": sections,\n    }\n```\n\n### Test Classes and Methods:\n\n#### [x] Class 1: `TestEpubToSkillConverterInit` (8 tests)\n\n**Happy path:**\n- `test_init_with_name_and_epub_path` — basic config with name + epub_path\n- `test_init_with_full_config` — config with all fields (name, epub_path, description, categories)\n- `test_default_description_uses_name` — description defaults to \"Use when referencing {name} documentation\"\n- `test_skill_dir_uses_name` — skill_dir is `output/{name}`\n- `test_data_file_uses_name` — data_file is `output/{name}_extracted.json`\n\n**Negative:**\n- `test_init_requires_name` — missing \"name\" key raises KeyError\n- `test_init_empty_name` — empty string name still works (no crash)\n\n**Edge case:**\n- `test_init_with_special_characters_in_name` — name with spaces/dashes sanitized for paths\n\n#### [x] Class 2: `TestEpubExtraction` (12 tests)\n\n**Happy path:**\n- `test_extract_basic_epub` — mock ebooklib, verify sections extracted in spine order\n- `test_extract_metadata` — verify Dublin Core metadata extraction (title, creator, language, etc.)\n- `test_extract_multiple_chapters` — multiple spine items produce multiple sections\n- `test_extract_code_blocks` — `<pre><code>` elements extracted with language detection\n- `test_extract_images` — ITEM_IMAGE items extracted with correct content\n- `test_heading_boundary_splitting` — h1/h2 boundaries create new sections\n\n**Negative:**\n- `test_extract_missing_file_raises_error` — FileNotFoundError for nonexistent path\n- `test_extract_invalid_epub_raises_error` — ValueError for corrupted/non-EPUB file\n- `test_extract_deps_not_installed` — RuntimeError with install instructions when ebooklib missing\n\n**Edge cases:**\n- `test_extract_empty_spine` — EPUB with no spine items produces empty sections list\n- `test_extract_spine_item_no_body` — XHTML without `<body>` tag skipped gracefully\n- `test_extract_non_linear_spine_items` — linear=\"no\" items still extracted (included but flagged)\n\n#### [x] Class 3: `TestEpubDrmDetection` (6 tests)\n\n**Happy path:**\n- `test_no_drm_detected` — normal EPUB without encryption.xml returns False\n\n**Negative:**\n- `test_drm_detected_adobe_adept` — encryption.xml with Adobe namespace raises RuntimeError\n- `test_drm_detected_apple_fairplay` — encryption.xml with Apple namespace raises RuntimeError\n- `test_drm_detected_readium_lcp` — encryption.xml with Readium namespace raises RuntimeError\n\n**Edge cases:**\n- `test_font_obfuscation_not_drm` — encryption.xml with only IDPF font obfuscation algorithm (`http://www.idpf.org/2008/embedding`) is NOT DRM, extraction proceeds\n- `test_drm_error_message_is_clear` — error message mentions DRM and suggests removing protection\n\n#### [x] Class 4: `TestEpubCategorization` (8 tests)\n\n**Happy path:**\n- `test_single_source_creates_one_category` — single EPUB creates category named after file\n- `test_keyword_categorization` — sections matched to categories by keyword scoring\n- `test_no_categories_uses_default` — no category config creates single \"content\" category\n\n**Negative:**\n- `test_categorize_empty_sections` — empty sections list produces empty categories\n- `test_categorize_no_keyword_matches` — unmatched sections go to \"other\" category\n\n**Edge cases:**\n- `test_categorize_single_section` — one section creates one category\n- `test_categorize_many_sections` — 50+ sections categorized correctly\n- `test_categorize_preserves_section_order` — sections maintain original order within categories\n\n#### [x] Class 5: `TestEpubSkillBuilding` (10 tests)\n\n**Happy path:**\n- `test_build_creates_directory_structure` — output/{name}/, references/, scripts/, assets/ created\n- `test_build_generates_skill_md` — SKILL.md created with YAML frontmatter\n- `test_build_generates_reference_files` — reference markdown files created per category\n- `test_build_generates_index` — references/index.md created with category links\n- `test_skill_md_contains_metadata` — SKILL.md includes title, author, language from metadata\n- `test_skill_md_yaml_frontmatter` — frontmatter has name and description fields\n\n**Negative:**\n- `test_build_without_extracted_data_fails` — calling build_skill() before extraction raises error\n\n**Edge cases:**\n- `test_build_overwrites_existing_output` — re-running build overwrites existing files\n- `test_build_with_long_name` — name > 64 chars truncated in YAML frontmatter\n- `test_build_with_unicode_content` — Unicode text (CJK, Arabic, emoji) preserved correctly\n\n#### [x] Class 6: `TestEpubCodeBlocks` (8 tests)\n\n**Happy path:**\n- `test_code_blocks_included_in_reference_files` — code samples appear in reference markdown\n- `test_code_blocks_in_skill_md_top_15` — SKILL.md shows top 15 code examples by quality\n- `test_code_language_grouped` — code examples grouped by language in SKILL.md\n\n**Edge cases:**\n- `test_empty_code_block` — `<pre><code></code></pre>` with no content skipped\n- `test_code_block_with_html_entities` — `&lt;`, `&gt;`, `&amp;` decoded to `<`, `>`, `&`\n- `test_code_block_with_syntax_highlighting_spans` — `<span class=\"keyword\">` stripped, plain text preserved\n- `test_code_block_language_from_class` — `class=\"language-python\"`, `class=\"code-rust\"` detected\n- `test_code_quality_scoring` — scoring heuristic produces expected ranges (0-10)\n\n#### [x] Class 7: `TestEpubTables` (5 tests)\n\n**Happy path:**\n- `test_tables_in_reference_files` — tables rendered as markdown in reference files\n- `test_table_with_headers` — headers from `<thead>` used correctly\n\n**Edge cases:**\n- `test_table_no_thead` — first row used as headers when no `<thead>`\n- `test_empty_table` — empty `<table>` element handled gracefully\n- `test_table_with_colspan_rowspan` — complex tables don't crash (data may be imperfect)\n\n#### [x] Class 8: `TestEpubImages` (7 tests)\n\n**Happy path:**\n- `test_images_saved_to_assets` — image bytes written to assets/ directory\n- `test_image_references_in_markdown` — markdown `![Image](../assets/...)` references correct\n\n**Negative:**\n- `test_image_with_zero_bytes` — empty image content skipped\n\n**Edge cases:**\n- `test_svg_images_handled` — SVG items (ITEM_VECTOR) extracted or skipped gracefully\n- `test_image_filename_conflicts` — duplicate filenames disambiguated\n- `test_cover_image_identified` — cover image (ITEM_COVER) extracted\n- `test_many_images` — 100+ images extracted without error\n\n#### [x] Class 9: `TestEpubErrorHandling` (10 tests)\n\n**Negative / error cases:**\n- `test_missing_epub_file_raises_error` — FileNotFoundError for nonexistent path\n- `test_not_a_file_raises_error` — ValueError when path is a directory\n- `test_not_epub_extension_raises_error` — ValueError for .txt, .pdf, .doc files\n- `test_corrupted_zip_raises_error` — ValueError or RuntimeError for corrupted ZIP\n- `test_missing_container_xml` — ValueError for ZIP without META-INF/container.xml\n- `test_missing_opf_file` — ValueError when container.xml points to nonexistent OPF\n- `test_drm_protected_raises_error` — RuntimeError with clear DRM message\n- `test_empty_epub_raises_error` — ValueError for EPUB with no content documents\n- `test_ebooklib_not_installed_error` — RuntimeError with install instructions\n- `test_malformed_xhtml_handled_gracefully` — unclosed tags, invalid entities don't crash (BeautifulSoup tolerant parsing)\n\n#### [x] Class 10: `TestEpubJSONWorkflow` (6 tests)\n\n**Happy path:**\n- `test_load_extracted_json` — load previously extracted JSON\n- `test_build_from_json` — full workflow: load JSON → categorize → build\n- `test_json_round_trip` — extract → save JSON → load JSON → build produces same output\n\n**Negative:**\n- `test_load_invalid_json` — malformed JSON raises appropriate error\n- `test_load_nonexistent_json` — FileNotFoundError for missing file\n\n**Edge case:**\n- `test_json_with_missing_fields` — partial JSON (missing optional fields) still works\n\n#### [x] Class 11: `TestEpubCLIArguments` (8 tests)\n\n**Happy path:**\n- `test_epub_flag_accepted` — `--epub path.epub` parsed correctly\n- `test_from_json_flag_accepted` — `--from-json data.json` parsed correctly\n- `test_name_flag_accepted` — `--name mybook` parsed correctly\n- `test_enhance_level_default_zero` — enhance-level defaults to 0 for EPUB\n- `test_dry_run_flag` — `--dry-run` flag parsed correctly\n\n**Negative:**\n- `test_no_args_shows_error` — no `--epub` or `--from-json` shows error\n\n**Integration:**\n- `test_verbose_flag` — `--verbose` accepted\n- `test_quiet_flag` — `--quiet` accepted\n\n#### [x] Class 12: `TestEpubHelperFunctions` (6 tests)\n\n- `test_infer_description_from_metadata_description` — uses description field\n- `test_infer_description_from_metadata_title` — falls back to title\n- `test_infer_description_fallback` — falls back to name-based template\n- `test_infer_description_empty_metadata` — empty dict returns fallback\n- `test_score_code_quality_ranges` — scoring returns 0-10\n- `test_sanitize_filename` — special characters cleaned\n\n#### [x] Class 13: `TestEpubSourceDetection` (6 tests)\n\n- `test_epub_detected_as_epub_type` — `.epub` extension detected correctly\n- `test_epub_suggested_name` — filename stem used as suggested name\n- `test_epub_validation_missing_file` — validation raises ValueError for missing file\n- `test_epub_validation_not_a_file` — validation raises ValueError for directory\n- `test_epub_with_path` — `./books/test.epub` detected with correct file_path\n- `test_pdf_still_detected` — regression test: `.pdf` still detected as pdf type\n\n#### [x] Class 14: `TestEpubEdgeCases` (8 tests)\n\n**Per W3C EPUB 3.3 spec edge cases:**\n- `test_epub2_vs_epub3` — both versions parse successfully (ebooklib handles both)\n- `test_epub_no_toc` — EPUB without table of contents extracts using spine order\n- `test_epub_empty_chapters` — chapters with no text content skipped gracefully\n- `test_epub_single_chapter` — book with one spine item produces valid output\n- `test_epub_unicode_content` — CJK, Arabic, Cyrillic, emoji text preserved\n- `test_epub_large_section_count` — 100+ sections processed without error\n- `test_epub_nested_headings` — h3/h4/h5/h6 become sub-headings within sections\n- `test_fixed_layout_detected` — fixed-layout EPUB produces warning but still extracts text\n\n**Total: ~108 test methods across 14 classes**\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `pytest tests/test_epub_scraper.py -v` — all 107 tests pass\n- [x] `pytest tests/ -v -x -m \"not slow and not integration\"` — 982 passed (1 pre-existing unrelated failure in test_git_sources_e2e)\n- [x] `ruff check tests/test_epub_scraper.py` passes\n- [x] `ruff format --check tests/test_epub_scraper.py` passes\n- [x] Test count >= 100 methods (107 tests across 14 classes)\n\n#### Manual Verification:\n- [x] Review test coverage includes: happy path, negative, edge cases, CLI, source detection, DRM, JSON workflow\n- [x] Verify no tests require actual EPUB files or ebooklib installed (all use mocks/skipTest guards)\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding to the next phase.\n\n---\n\n## Phase 4: Documentation\n\n### Overview\nUpdate CLAUDE.md and CHANGELOG.md to reflect the new EPUB support.\n\n### Changes Required:\n\n#### [x] 1. Update CLAUDE.md\n**File**: `CLAUDE.md`\n**Changes**:\n\nAdd to Commands section (after pdf line):\n```\nskill-seekers create book.epub --name myskill\n```\n\nAdd to \"Unified create\" examples:\n```\nskill-seekers create book.epub\n```\n\nAdd to Key source files table:\n```\n| Core scraping | `cli/epub_scraper.py` |\n```\n\nAdd to \"Adding things → New create command flags\" section:\n```\n- Source-specific → `EPUB_ARGUMENTS`\n```\n\n#### [x] 2. Update CHANGELOG.md\n**File**: `CHANGELOG.md`\n**Changes**: Add entry for EPUB support under next version\n\n```markdown\n### Added\n- EPUB (.epub) input support via `skill-seekers create book.epub` or `skill-seekers epub --epub book.epub`\n- Extracts chapters, metadata, code blocks, images, and tables from EPUB 2 and EPUB 3 files\n- DRM detection with clear error messages\n- Optional dependency: `pip install \"skill-seekers[epub]\"`\n```\n\n### Success Criteria:\n\n#### Automated Verification:\n- [x] `ruff check` passes on any modified files\n- [x] `pytest tests/ -v -x -m \"not slow and not integration\"` — all tests still pass (982 passed, 1 pre-existing failure)\n\n#### Manual Verification:\n- [x] CLAUDE.md accurately reflects new commands\n- [x] CHANGELOG.md entry is clear and complete\n\n**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human before proceeding.\n\n---\n\n## Testing Strategy\n\n### Unit Tests (Phase 3 — ~108 tests):\n\n**By category:**\n| Category | Count | What's tested |\n|----------|-------|---------------|\n| Initialization | 8 | Config parsing, defaults, edge cases |\n| Extraction | 12 | Spine iteration, metadata, headings, code, images |\n| DRM detection | 6 | Adobe, Apple, Readium, font obfuscation (not DRM) |\n| Categorization | 8 | Single/multi category, keywords, empty, ordering |\n| Skill building | 10 | Directory structure, SKILL.md, references, index |\n| Code blocks | 8 | Extraction, quality, language detection, HTML entities |\n| Tables | 5 | Headers, no-thead fallback, empty, colspan |\n| Images | 7 | Save, references, SVG, conflicts, cover, many |\n| Error handling | 10 | Missing file, corrupt, DRM, no deps, malformed XHTML |\n| JSON workflow | 6 | Load, build, round-trip, invalid, missing fields |\n| CLI arguments | 8 | Flags, defaults, dry-run, verbose/quiet |\n| Helper functions | 6 | Description inference, quality scoring, filename sanitization |\n| Source detection | 6 | Detection, validation, regression |\n| Edge cases | 8 | EPUB 2/3, no TOC, empty chapters, Unicode, fixed-layout |\n\n### Integration Tests:\n- Full extract → categorize → build workflow with mock ebooklib\n- JSON round-trip (extract → save → load → build)\n\n### Manual Testing Steps:\n1. `pip install -e \".[epub]\"` — verify install\n2. `skill-seekers create book.epub` with a real EPUB file — verify output directory structure\n3. `skill-seekers create book.epub --dry-run` — verify dry run output\n4. `skill-seekers create drm-book.epub` — verify DRM error message\n5. `skill-seekers create nonexistent.epub` — verify file-not-found error\n6. Open generated `SKILL.md` — verify content quality and structure\n\n## Performance Considerations\n\n- ebooklib loads entire EPUB into memory. For typical books (<50MB), this is fine\n- For very large EPUBs (100MB+), memory usage may spike. No mitigation needed for v1 — document as known limitation\n- BeautifulSoup parsing of XHTML is fast. No performance concerns expected\n\n## Migration Notes\n\n- No migration needed — this is a new feature with no existing data to migrate\n- Optional dependency (`ebooklib`) means existing installs are unaffected\n- No breaking changes to any existing commands or APIs\n\n## References\n\n- [W3C EPUB 3.3 Specification](https://www.w3.org/TR/epub-33/) — authoritative source of truth\n- [W3C EPUB Reading Systems 3.3](https://www.w3.org/TR/epub-rs-33/) — reading system requirements\n- [ebooklib GitHub](https://github.com/aerkalov/ebooklib) — Python EPUB library\n- [ebooklib PyPI](https://pypi.org/project/EbookLib/) — v0.20, Python 3.9-3.13\n- [Research document](../research/2026-03-14-epub-input-support-affected-files.md) — affected files analysis\n- Similar implementation: `src/skill_seekers/cli/word_scraper.py` — closest analog\n- Similar tests: `tests/test_word_scraper.py` — test pattern template\n\n<!-- File: docs/agents/research/2026-03-14-epub-input-support-affected-files.md (Tokens: ~2734 | Category: subagent-persona) -->\n---\ndate: 2026-03-14T12:54:24.700367+00:00\ngit_commit: 7c90a4b9c9bccac8341b0769550d77aae3b4e524\nbranch: development\ntopic: \"What files would be affected to add .epub support for input\"\ntags: [research, codebase, epub, input-format, scraper]\nstatus: complete\n---\n\n> 🗄️ **Historical — completed** — This research informed the EPUB implementation that is now live in Skill Seekers v3.6.0.\n\n# Research: What files would be affected to add .epub support for input\n\n## Research Question\n\nWhat files would be affected to add .epub support for input.\n\n## Summary\n\nAdding `.epub` input support follows an established pattern already used for PDF and Word (.docx) formats. The codebase has a consistent multi-layer architecture for document input formats: source detection, argument definitions, parser registration, create command routing, standalone scraper module, and tests. Based on analysis of the existing PDF and Word implementations, **16 existing files would need modification** and **4 new files would need to be created**.\n\n## Detailed Findings\n\n### New Files to Create (4 files)\n\n| File | Purpose |\n|------|---------|\n| `src/skill_seekers/cli/epub_scraper.py` | Core EPUB extraction and skill building logic (analog: `word_scraper.py` at ~750 lines) |\n| `src/skill_seekers/cli/arguments/epub.py` | EPUB-specific argument definitions (analog: `arguments/word.py`) |\n| `src/skill_seekers/cli/parsers/epub_parser.py` | Subcommand parser class (analog: `parsers/word_parser.py`) |\n| `tests/test_epub_scraper.py` | Test suite (analog: `test_word_scraper.py` at ~750 lines, 130+ tests) |\n\n### Existing Files to Modify (16 files)\n\n#### 1. Source Detection Layer\n\n**`src/skill_seekers/cli/source_detector.py`** (3 locations)\n\n- **`SourceDetector.detect()`** (line ~60): Add `.epub` extension check, following the `.docx` pattern at line 63-64:\n  ```python\n  if source.endswith(\".epub\"):\n      return cls._detect_epub(source)\n  ```\n\n- **New method `_detect_epub()`**: Add detection method (following `_detect_word()` at lines 124-129):\n  ```python\n  @classmethod\n  def _detect_epub(cls, source: str) -> SourceInfo:\n      name = os.path.splitext(os.path.basename(source))[0]\n      return SourceInfo(\n          type=\"epub\", parsed={\"file_path\": source}, suggested_name=name, raw_input=source\n      )\n  ```\n\n- **`validate_source()`** (line ~250): Add epub validation block (following the word block at lines 273-278)\n\n- **Error message** (line ~94): Add EPUB example to the `ValueError` help text\n\n#### 2. CLI Dispatcher\n\n**`src/skill_seekers/cli/main.py`** (2 locations)\n\n- **`COMMAND_MODULES` dict** (line ~46): Add epub entry:\n  ```python\n  \"epub\": \"skill_seekers.cli.epub_scraper\",\n  ```\n\n- **Module docstring** (line ~1): Add `epub` to the commands list\n\n#### 3. Create Command Routing\n\n**`src/skill_seekers/cli/create_command.py`** (3 locations)\n\n- **`_route_to_scraper()`** (line ~121): Add `elif self.source_info.type == \"epub\":` routing case\n\n- **New `_route_epub()` method**: Following the `_route_word()` pattern at lines 331-352:\n  ```python\n  def _route_epub(self) -> int:\n      from skill_seekers.cli import epub_scraper\n      argv = [\"epub_scraper\"]\n      file_path = self.source_info.parsed[\"file_path\"]\n      argv.extend([\"--epub\", file_path])\n      self._add_common_args(argv)\n      # epub-specific args here\n      ...\n  ```\n\n- **`main()` epilog** (line ~537): Add EPUB example and source auto-detection entry\n\n- **Progressive help** (line ~590): Add `--help-epub` flag and handler block\n\n#### 4. Argument Definitions\n\n**`src/skill_seekers/cli/arguments/create.py`** (4 locations)\n\n- **New `EPUB_ARGUMENTS` dict** (~line 401): Define epub-specific arguments (e.g., `--epub` file path flag), following the `WORD_ARGUMENTS` pattern at lines 402-411\n\n- **`get_source_specific_arguments()`** (line 595): Add `\"epub\": EPUB_ARGUMENTS` to the `source_args` dict\n\n- **`add_create_arguments()`** (line 676): Add epub mode block:\n  ```python\n  if mode in [\"epub\", \"all\"]:\n      for arg_name, arg_def in EPUB_ARGUMENTS.items():\n          parser.add_argument(*arg_def[\"flags\"], **arg_def[\"kwargs\"])\n  ```\n\n#### 5. Parser Registration\n\n**`src/skill_seekers/cli/parsers/__init__.py`** (2 locations)\n\n- **Import** (line ~15): Add `from .epub_parser import EpubParser`\n\n- **`PARSERS` list** (line ~46): Add `EpubParser()` entry (near `WordParser()` and `PDFParser()`)\n\n#### 6. Package Configuration\n\n**`pyproject.toml`** (3 locations)\n\n- **`[project.optional-dependencies]`** (line ~111): Add `epub` optional dependency group:\n  ```toml\n  epub = [\n      \"ebooklib>=0.18\",\n  ]\n  ```\n\n- **`all` optional dependency group** (line ~178): Add epub dependency to the combined `all` group\n\n- **`[project.scripts]`** (line ~224): Add standalone entry point:\n  ```toml\n  skill-seekers-epub = \"skill_seekers.cli.epub_scraper:main\"\n  ```\n\n#### 7. Argument Commons\n\n**`src/skill_seekers/cli/arguments/common.py`**\n\n- No changes strictly required, but `add_all_standard_arguments()` is called by the new `arguments/epub.py` (no modification needed — it's used as-is)\n\n#### 8. Documentation / Configuration\n\n**`CLAUDE.md`** (2 locations)\n\n- **Commands section**: Add `epub` to the list of subcommands\n- **Key source files table**: Add `epub_scraper.py` entry\n\n**`CONTRIBUTING.md`** — Potentially update with epub format mention\n\n**`CHANGELOG.md`** — New feature entry\n\n### Files NOT Affected\n\nThese files do **not** need changes:\n\n- **`unified_scraper.py`** — Multi-source configs could add epub support later but it's not required for basic input support\n- **Platform adaptors** (`adaptors/*.py`) — Adaptors work on the output side (packaging), not input\n- **Enhancement system** (`enhance_skill.py`, `enhance_skill_local.py`) — Works generically on SKILL.md\n- **MCP server** (`mcp/server_fastmcp.py`) — Operates on completed skills\n- **`pdf_extractor_poc.py`** — PDF-specific extraction; epub needs its own extractor\n\n## Code References\n\n### Pattern to Follow (Word .docx implementation)\n\n- `src/skill_seekers/cli/word_scraper.py:1-750` — Full scraper with `WordToSkillConverter` class\n- `src/skill_seekers/cli/arguments/word.py:1-75` — Argument definitions with `add_word_arguments()`\n- `src/skill_seekers/cli/parsers/word_parser.py:1-33` — Parser class extending `SubcommandParser`\n- `tests/test_word_scraper.py:1-750` — Comprehensive test suite with 130+ tests\n\n### Key Integration Points\n\n- `src/skill_seekers/cli/source_detector.py:57-65` — File extension detection order\n- `src/skill_seekers/cli/source_detector.py:124-129` — `_detect_word()` method (template for `_detect_epub()`)\n- `src/skill_seekers/cli/create_command.py:121-143` — `_route_to_scraper()` dispatch\n- `src/skill_seekers/cli/create_command.py:331-352` — `_route_word()` (template for `_route_epub()`)\n- `src/skill_seekers/cli/arguments/create.py:401-411` — `WORD_ARGUMENTS` dict (template)\n- `src/skill_seekers/cli/arguments/create.py:595-604` — `get_source_specific_arguments()` mapping\n- `src/skill_seekers/cli/arguments/create.py:676-678` — `add_create_arguments()` mode handling\n- `src/skill_seekers/cli/parsers/__init__.py:35-59` — `PARSERS` registry list\n- `src/skill_seekers/cli/main.py:46-70` — `COMMAND_MODULES` dict\n- `pyproject.toml:111-115` — Optional dependency group pattern (docx)\n- `pyproject.toml:213-246` — Script entry points\n\n### Data Flow Architecture\n\nThe epub scraper would follow the same three-step pipeline as Word/PDF:\n\n1. **Extract** — Parse `.epub` file → sections with text, headings, code, images → save to `output/{name}_extracted.json`\n2. **Categorize** — Group sections by chapters/keywords\n3. **Build** — Generate `SKILL.md`, `references/*.md`, `references/index.md`, `assets/`\n\nThe intermediate JSON format uses the same structure as Word/PDF:\n```python\n{\n    \"source_file\": str,\n    \"metadata\": {\"title\", \"author\", \"created\", ...},\n    \"total_sections\": int,\n    \"total_code_blocks\": int,\n    \"total_images\": int,\n    \"languages_detected\": {str: int},\n    \"pages\": [  # sections\n        {\n            \"section_number\": int,\n            \"heading\": str,\n            \"text\": str,\n            \"code_samples\": [...],\n            \"images\": [...],\n            \"headings\": [...]\n        }\n    ]\n}\n```\n\n## Architecture Documentation\n\n### Document Input Format Pattern\n\nEach input format follows a consistent architecture:\n\n```\n[source_detector.py] → detect type by extension\n        ↓\n[create_command.py] → route to scraper\n        ↓\n[{format}_scraper.py] → extract → categorize → build skill\n        ↓\n[output/{name}/] → SKILL.md + references/ + assets/\n```\n\nSupporting files per format:\n- `arguments/{format}.py` — CLI argument definitions\n- `parsers/{format}_parser.py` — Subcommand parser class\n- `tests/test_{format}_scraper.py` — Test suite\n\n### Dependency Guard Pattern\n\nThe Word scraper uses an optional dependency guard that epub should replicate:\n\n```python\ntry:\n    import ebooklib\n    from ebooklib import epub\n    EPUB_AVAILABLE = True\nexcept ImportError:\n    EPUB_AVAILABLE = False\n\ndef _check_epub_deps():\n    if not EPUB_AVAILABLE:\n        raise RuntimeError(\n            \"ebooklib is required for EPUB support.\\n\"\n            'Install with: pip install \"skill-seekers[epub]\"\\n'\n            \"Or: pip install ebooklib\"\n        )\n```\n\n## Summary Table\n\n| Category | Files | Action |\n|----------|-------|--------|\n| New files | 4 | Create from scratch |\n| Source detection | 1 | Add epub detection + validation |\n| CLI dispatcher | 1 | Add command module mapping |\n| Create command | 1 | Add routing + help + examples |\n| Arguments | 1 | Add EPUB_ARGUMENTS + register in helpers |\n| Parser registry | 1 | Import + register EpubParser |\n| Package config | 1 | Add deps + entry point |\n| Documentation | 2+ | Update CLAUDE.md, CHANGELOG |\n| **Total** | **12+ modified, 4 new** | |\n\n## Open Questions\n\n- Should epub support reuse any of the existing HTML parsing from `word_scraper.py` (which uses mammoth to convert to HTML then parses with BeautifulSoup)? EPUB internally contains XHTML files, so BeautifulSoup parsing would be directly applicable.\n- Should the epub scraper support DRM-protected files, or only DRM-free epub files?\n- Should epub-specific arguments include options like `--chapter-range` (similar to PDF's `--pages`)?\n\n<!-- ... +5 more modular skills available via /api/skills/yusufkaraaslan/Skill_Seekers?path={path} -->\n</yakaai_skills>"}