[build-system] requires = ["setuptools>=61.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "skill-seekers" version = "2.7.2" description = "Convert documentation websites, GitHub repositories, and PDFs into Claude AI skills" readme = "README.md" requires-python = ">=3.10" license = {text = "MIT"} authors = [ {name = "Yusuf Karaaslan"} ] keywords = [ "claude", "ai", "documentation", "scraping", "skills", "llm", "mcp", "automation" ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Documentation", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup :: Markdown", ] # Core dependencies dependencies = [ "requests>=2.32.5", "beautifulsoup4>=4.14.2", "PyGithub>=2.5.0", "GitPython>=3.1.40", "httpx>=0.28.1", # Required for async scraping (core feature) "anthropic>=0.76.0", # Required for AI enhancement (core feature) "PyMuPDF>=1.24.14", "Pillow>=11.0.0", "pytesseract>=0.3.13", "pydantic>=2.12.3", "pydantic-settings>=2.11.0", "python-dotenv>=1.1.1", "jsonschema>=4.25.1", "click>=8.3.0", "Pygments>=2.19.2", "pathspec>=0.12.1", "networkx>=3.0", ] [project.optional-dependencies] # MCP server dependencies (NOW TRULY OPTIONAL) mcp = [ "mcp>=1.25,<2", "httpx>=0.28.1", "httpx-sse>=0.4.3", "uvicorn>=0.38.0", "starlette>=0.48.0", "sse-starlette>=3.0.2", ] # LLM platform-specific dependencies # Google Gemini support gemini = [ "google-generativeai>=0.8.0", ] # OpenAI ChatGPT support openai = [ "openai>=1.0.0", ] # All LLM platforms combined all-llms = [ "google-generativeai>=0.8.0", "openai>=1.0.0", ] # All optional dependencies combined (dev dependencies now in [dependency-groups]) all = [ "mcp>=1.25,<2", "httpx>=0.28.1", "httpx-sse>=0.4.3", "uvicorn>=0.38.0", "starlette>=0.48.0", "sse-starlette>=3.0.2", "google-generativeai>=0.8.0", "openai>=1.0.0", ] [project.urls] Homepage = "https://skillseekersweb.com/" Website = "https://skillseekersweb.com/" Repository = "https://github.com/yusufkaraaslan/Skill_Seekers" "Bug Tracker" = "https://github.com/yusufkaraaslan/Skill_Seekers/issues" Documentation = "https://skillseekersweb.com/" "Config Browser" = "https://skillseekersweb.com/" [project.scripts] # Main unified CLI skill-seekers = "skill_seekers.cli.main:main" # Individual tool entry points skill-seekers-config = "skill_seekers.cli.config_command:main" skill-seekers-resume = "skill_seekers.cli.resume_command:main" skill-seekers-scrape = "skill_seekers.cli.doc_scraper:main" skill-seekers-github = "skill_seekers.cli.github_scraper:main" skill-seekers-pdf = "skill_seekers.cli.pdf_scraper:main" skill-seekers-unified = "skill_seekers.cli.unified_scraper:main" skill-seekers-enhance = "skill_seekers.cli.enhance_skill_local:main" skill-seekers-enhance-status = "skill_seekers.cli.enhance_status:main" skill-seekers-package = "skill_seekers.cli.package_skill:main" skill-seekers-upload = "skill_seekers.cli.upload_skill:main" skill-seekers-estimate = "skill_seekers.cli.estimate_pages:main" skill-seekers-install = "skill_seekers.cli.install_skill:main" skill-seekers-install-agent = "skill_seekers.cli.install_agent:main" skill-seekers-codebase = "skill_seekers.cli.codebase_scraper:main" skill-seekers-patterns = "skill_seekers.cli.pattern_recognizer:main" skill-seekers-how-to-guides = "skill_seekers.cli.how_to_guide_builder:main" skill-seekers-setup = "skill_seekers.cli.setup_wizard:main" [tool.setuptools] package-dir = {"" = "src"} [tool.setuptools.packages.find] where = ["src"] include = ["skill_seekers*"] namespaces = false [tool.setuptools.package-data] skill_seekers = ["py.typed"] [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = "-v --tb=short --strict-markers" markers = [ "asyncio: mark test as an async test", "slow: mark test as slow running (>5 seconds)", "integration: mark test as integration test (requires external services)", "e2e: mark test as end-to-end (resource-intensive, may create files)", "venv: mark test as requiring virtual environment setup", "bootstrap: mark test as bootstrap feature specific", ] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" [tool.coverage.run] source = ["src/skill_seekers"] omit = ["*/tests/*", "*/__pycache__/*", "*/venv/*"] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "@abstractmethod", ] [tool.ruff] line-length = 100 target-version = "py310" src = ["src", "tests"] [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # Pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade "ARG", # flake8-unused-arguments "SIM", # flake8-simplify ] ignore = [ "E501", # line too long (handled by formatter) ] [tool.ruff.lint.isort] known-first-party = ["skill_seekers"] [tool.mypy] python_version = "3.10" warn_return_any = true warn_unused_configs = true disallow_untyped_defs = false disallow_incomplete_defs = false check_untyped_defs = true ignore_missing_imports = true show_error_codes = true pretty = true [[tool.mypy.overrides]] module = "tests.*" disallow_untyped_defs = false check_untyped_defs = false [dependency-groups] dev = [ "pytest>=8.4.2", "pytest-asyncio>=0.24.0", "pytest-cov>=7.0.0", "coverage>=7.11.0", "ruff>=0.14.13", "mypy>=1.19.1", ]