vouch 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. vouch-0.2.0/.github/ISSUE_TEMPLATE/bug_report.md +36 -0
  2. vouch-0.2.0/.github/ISSUE_TEMPLATE/feature_request.md +15 -0
  3. vouch-0.2.0/.github/ISSUE_TEMPLATE/new_profile.md +33 -0
  4. vouch-0.2.0/.github/PULL_REQUEST_TEMPLATE.md +23 -0
  5. vouch-0.2.0/.github/workflows/ci.yml +67 -0
  6. vouch-0.2.0/.github/workflows/release.yml +34 -0
  7. vouch-0.2.0/.gitignore +84 -0
  8. vouch-0.2.0/CHANGELOG.md +131 -0
  9. vouch-0.2.0/CODE_OF_CONDUCT.md +33 -0
  10. vouch-0.2.0/CONTRIBUTING.md +45 -0
  11. vouch-0.2.0/LICENSE +21 -0
  12. vouch-0.2.0/PKG-INFO +1074 -0
  13. vouch-0.2.0/README.md +987 -0
  14. vouch-0.2.0/SECURITY.md +28 -0
  15. vouch-0.2.0/docs/plugins.md +134 -0
  16. vouch-0.2.0/examples/analysis_draft.md +28 -0
  17. vouch-0.2.0/examples/sites.example.yaml +27 -0
  18. vouch-0.2.0/examples/test_18_v2.py +151 -0
  19. vouch-0.2.0/examples/test_20_queries.py +179 -0
  20. vouch-0.2.0/examples/test_30_queries_v2.py +243 -0
  21. vouch-0.2.0/examples/test_90_queries.py +322 -0
  22. vouch-0.2.0/examples/test_captcha_compare.py +111 -0
  23. vouch-0.2.0/examples/test_captcha_vision.py +193 -0
  24. vouch-0.2.0/examples/test_llm_extract_quality.py +150 -0
  25. vouch-0.2.0/examples/test_smoke_v2.py +148 -0
  26. vouch-0.2.0/examples/test_v2_final.py +139 -0
  27. vouch-0.2.0/pyproject.toml +121 -0
  28. vouch-0.2.0/tests/__init__.py +0 -0
  29. vouch-0.2.0/tests/conftest.py +40 -0
  30. vouch-0.2.0/tests/fixtures/__init__.py +1 -0
  31. vouch-0.2.0/tests/fixtures/arxiv_search.html +47 -0
  32. vouch-0.2.0/tests/test_async.py +55 -0
  33. vouch-0.2.0/tests/test_cache.py +42 -0
  34. vouch-0.2.0/tests/test_captcha.py +248 -0
  35. vouch-0.2.0/tests/test_catalog.py +60 -0
  36. vouch-0.2.0/tests/test_cli.py +83 -0
  37. vouch-0.2.0/tests/test_css_selectors.py +113 -0
  38. vouch-0.2.0/tests/test_dns_resolver.py +34 -0
  39. vouch-0.2.0/tests/test_engine.py +75 -0
  40. vouch-0.2.0/tests/test_extraction.py +35 -0
  41. vouch-0.2.0/tests/test_extraction_e2e.py +101 -0
  42. vouch-0.2.0/tests/test_lang.py +35 -0
  43. vouch-0.2.0/tests/test_llm_extract.py +201 -0
  44. vouch-0.2.0/tests/test_models.py +25 -0
  45. vouch-0.2.0/tests/test_plugins.py +136 -0
  46. vouch-0.2.0/tests/test_profiles.py +67 -0
  47. vouch-0.2.0/tests/test_profiles_update.py +122 -0
  48. vouch-0.2.0/tests/test_quality_detector.py +63 -0
  49. vouch-0.2.0/tests/test_result_formatters.py +77 -0
  50. vouch-0.2.0/tests/test_router.py +34 -0
  51. vouch-0.2.0/vouch/__init__.py +59 -0
  52. vouch-0.2.0/vouch/_lang.py +264 -0
  53. vouch-0.2.0/vouch/_llm.py +181 -0
  54. vouch-0.2.0/vouch/adapters/__init__.py +68 -0
  55. vouch-0.2.0/vouch/adapters/base.py +28 -0
  56. vouch-0.2.0/vouch/adapters/browser.py +299 -0
  57. vouch-0.2.0/vouch/adapters/browser_pool.py +240 -0
  58. vouch-0.2.0/vouch/adapters/http.py +183 -0
  59. vouch-0.2.0/vouch/adapters/stealth.py +40 -0
  60. vouch-0.2.0/vouch/captcha/__init__.py +25 -0
  61. vouch-0.2.0/vouch/captcha/solver.py +245 -0
  62. vouch-0.2.0/vouch/captcha/tesseract.py +147 -0
  63. vouch-0.2.0/vouch/catalog.py +306 -0
  64. vouch-0.2.0/vouch/cli.py +364 -0
  65. vouch-0.2.0/vouch/config.py +95 -0
  66. vouch-0.2.0/vouch/discovery/__init__.py +9 -0
  67. vouch-0.2.0/vouch/discovery/cache.py +163 -0
  68. vouch-0.2.0/vouch/discovery/humanize.py +57 -0
  69. vouch-0.2.0/vouch/discovery/probe.py +58 -0
  70. vouch-0.2.0/vouch/discovery/search_bar.py +136 -0
  71. vouch-0.2.0/vouch/dns_resolver.py +103 -0
  72. vouch-0.2.0/vouch/engine.py +693 -0
  73. vouch-0.2.0/vouch/exceptions.py +45 -0
  74. vouch-0.2.0/vouch/extraction/__init__.py +7 -0
  75. vouch-0.2.0/vouch/extraction/css_selectors.py +366 -0
  76. vouch-0.2.0/vouch/extraction/llm.py +41 -0
  77. vouch-0.2.0/vouch/extraction/llm_extract.py +509 -0
  78. vouch-0.2.0/vouch/extraction/pdf.py +32 -0
  79. vouch-0.2.0/vouch/extraction/trafilatura.py +243 -0
  80. vouch-0.2.0/vouch/integrations/__init__.py +9 -0
  81. vouch-0.2.0/vouch/integrations/_common.py +30 -0
  82. vouch-0.2.0/vouch/integrations/crewai.py +52 -0
  83. vouch-0.2.0/vouch/integrations/langchain.py +55 -0
  84. vouch-0.2.0/vouch/integrations/mcp.py +90 -0
  85. vouch-0.2.0/vouch/integrations/pydantic_ai.py +45 -0
  86. vouch-0.2.0/vouch/models.py +129 -0
  87. vouch-0.2.0/vouch/monitor/__init__.py +8 -0
  88. vouch-0.2.0/vouch/monitor/notify.py +58 -0
  89. vouch-0.2.0/vouch/monitor/watcher.py +141 -0
  90. vouch-0.2.0/vouch/plugins.py +169 -0
  91. vouch-0.2.0/vouch/profiles/__init__.py +28 -0
  92. vouch-0.2.0/vouch/profiles/builtin.yaml +169 -0
  93. vouch-0.2.0/vouch/profiles/registry.py +114 -0
  94. vouch-0.2.0/vouch/profiles/update.py +168 -0
  95. vouch-0.2.0/vouch/router/__init__.py +33 -0
  96. vouch-0.2.0/vouch/router/all_router.py +12 -0
  97. vouch-0.2.0/vouch/router/base.py +40 -0
  98. vouch-0.2.0/vouch/router/embedding_router.py +91 -0
  99. vouch-0.2.0/vouch/router/llm_router.py +109 -0
  100. vouch-0.2.0/vouch/router/tag_router.py +48 -0
  101. vouch-0.2.0/vouch/server.py +168 -0
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: Bug report
3
+ about: Something isn't working as expected
4
+ title: "[bug] "
5
+ labels: bug
6
+ ---
7
+
8
+ **What happened?**
9
+ A clear and concise description.
10
+
11
+ **Reproducer**
12
+
13
+ ```python
14
+ from vouch import SearchEngine, Site
15
+ engine = SearchEngine(llm="ollama/qwen2.5:7b")
16
+ engine.add(Site("..."))
17
+ result = engine.search("...")
18
+ ```
19
+
20
+ **Expected vs actual**
21
+
22
+ - Expected: ...
23
+ - Actual: ...
24
+
25
+ **Environment**
26
+
27
+ - OS: <Windows / macOS / Linux>
28
+ - Python: <output of `python --version`>
29
+ - vouch: <output of `vouch --version`>
30
+ - Extras installed: <`browser`, `stealth`, `monitor`, etc.>
31
+
32
+ **Logs / traceback**
33
+
34
+ ```
35
+ <paste here>
36
+ ```
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea or improvement
4
+ title: "[feature] "
5
+ labels: enhancement
6
+ ---
7
+
8
+ **Use case**
9
+ Describe what you're trying to accomplish.
10
+
11
+ **Proposed API**
12
+ What would the public API look like? Example code is gold.
13
+
14
+ **Alternatives considered**
15
+ Anything you've already ruled out, and why.
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: New site profile
3
+ about: Submit a curated profile for a popular site
4
+ title: "[profile] add <domain>"
5
+ labels: profile
6
+ ---
7
+
8
+ **Domain**
9
+ e.g. `example.com`
10
+
11
+ **Why curate this site?**
12
+ What category, language, audience? Why should vouch's users know about it?
13
+
14
+ **Suggested profile YAML**
15
+
16
+ ```yaml
17
+ - url: example.com
18
+ category: ...
19
+ description: >
20
+ ...
21
+ tags: [..., ...]
22
+ search_url_template: "/search?q={query}"
23
+ ```
24
+
25
+ **Notes on extraction**
26
+
27
+ - Does it block default UA? (yes/no)
28
+ - Server-rendered or JS-only?
29
+ - Any anti-bot WAF (Cloudflare, DataDome, …)?
30
+
31
+ **Sample search you tested**
32
+
33
+ `<query that works>` → expect to find `<sample result title>`
@@ -0,0 +1,23 @@
1
+ ## Summary
2
+
3
+ What does this PR change and why?
4
+
5
+ ## Type of change
6
+
7
+ - [ ] Bug fix
8
+ - [ ] New feature
9
+ - [ ] Breaking API change
10
+ - [ ] New site profile (`vouch/profiles/builtin.yaml`)
11
+ - [ ] Docs / examples / tests only
12
+
13
+ ## Test plan
14
+
15
+ - [ ] Existing test suite passes (`pytest -q`)
16
+ - [ ] Lint passes (`ruff check . && ruff format --check .`)
17
+ - [ ] New tests added for the change (where appropriate)
18
+
19
+ ## Checklist
20
+
21
+ - [ ] CHANGELOG updated under `[Unreleased]`
22
+ - [ ] Public API additions exported from `vouch/__init__.py`
23
+ - [ ] Docstrings on new public functions
@@ -0,0 +1,67 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ test:
14
+ runs-on: ${{ matrix.os }}
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ os: [ubuntu-latest, macos-latest, windows-latest]
19
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
20
+
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+
24
+ - name: Set up Python ${{ matrix.python-version }}
25
+ uses: actions/setup-python@v5
26
+ with:
27
+ python-version: ${{ matrix.python-version }}
28
+ cache: pip
29
+
30
+ - name: Install
31
+ run: |
32
+ python -m pip install --upgrade pip
33
+ pip install -e ".[dev]"
34
+
35
+ - name: Lint (ruff)
36
+ run: |
37
+ ruff check vouch tests
38
+ ruff format --check vouch tests
39
+
40
+ - name: Test
41
+ run: pytest --cov=vouch --cov-report=xml -q
42
+
43
+ - name: Upload coverage
44
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
45
+ uses: codecov/codecov-action@v4
46
+ with:
47
+ file: coverage.xml
48
+ fail_ci_if_error: false
49
+
50
+ build:
51
+ needs: test
52
+ runs-on: ubuntu-latest
53
+ steps:
54
+ - uses: actions/checkout@v4
55
+ - uses: actions/setup-python@v5
56
+ with:
57
+ python-version: "3.12"
58
+ - run: pip install build
59
+ - run: python -m build
60
+ - name: Verify wheel installs cleanly
61
+ run: |
62
+ pip install dist/vouch-*.whl
63
+ python -c "import vouch; print('OK', vouch.__version__)"
64
+ - uses: actions/upload-artifact@v4
65
+ with:
66
+ name: dist
67
+ path: dist/
@@ -0,0 +1,34 @@
1
+ name: Release to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: write
9
+ id-token: write # for trusted publishing
10
+
11
+ jobs:
12
+ release:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - uses: actions/setup-python@v5
17
+ with:
18
+ python-version: "3.12"
19
+
20
+ - name: Build
21
+ run: |
22
+ python -m pip install --upgrade pip build
23
+ python -m build
24
+
25
+ - name: Publish to PyPI
26
+ uses: pypa/gh-action-pypi-publish@release/v1
27
+ # Configure trusted publishing on PyPI:
28
+ # https://docs.pypi.org/trusted-publishers/
29
+
30
+ - name: Create GitHub release
31
+ uses: softprops/action-gh-release@v2
32
+ with:
33
+ generate_release_notes: true
34
+ files: dist/*
vouch-0.2.0/.gitignore ADDED
@@ -0,0 +1,84 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # Distribution / packaging
7
+ .Python
8
+ build/
9
+ develop-eggs/
10
+ dist/
11
+ downloads/
12
+ eggs/
13
+ .eggs/
14
+ lib/
15
+ lib64/
16
+ parts/
17
+ sdist/
18
+ var/
19
+ wheels/
20
+ share/python-wheels/
21
+ *.egg-info/
22
+ .installed.cfg
23
+ *.egg
24
+ MANIFEST
25
+
26
+ # PyInstaller
27
+ *.manifest
28
+ *.spec
29
+
30
+ # Unit test / coverage reports
31
+ htmlcov/
32
+ .tox/
33
+ .nox/
34
+ .coverage
35
+ .coverage.*
36
+ .cache
37
+ nosetests.xml
38
+ coverage.xml
39
+ *.cover
40
+ *.py,cover
41
+ .hypothesis/
42
+ .pytest_cache/
43
+ cover/
44
+
45
+ # Environments
46
+ .env
47
+ .venv
48
+ env/
49
+ venv/
50
+ ENV/
51
+
52
+ # Editor
53
+ .idea/
54
+ .vscode/
55
+ *.swp
56
+ *.swo
57
+ .DS_Store
58
+ Thumbs.db
59
+
60
+ # curio runtime data
61
+ .curio/
62
+ *.db
63
+ *.db-journal
64
+ *.sqlite
65
+ *.sqlite3
66
+
67
+ # test scratch dirs and logs
68
+ test-cache*/
69
+ test-*-output*.log
70
+ smoke-output.log
71
+ *.log
72
+
73
+ # Playwright
74
+ playwright-report/
75
+ test-results/
76
+
77
+ # Type checkers
78
+ .mypy_cache/
79
+ .pytype/
80
+ .ruff_cache/
81
+
82
+ # Jupyter
83
+ .ipynb_checkpoints
84
+ *.ipynb
@@ -0,0 +1,131 @@
1
+ # Changelog
2
+
3
+ All notable changes to **vouch** are documented here.
4
+
5
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
6
+ this project follows [Semantic Versioning](https://semver.org/).
7
+
8
+ ## [0.2.0] — 2026-05-10
9
+
10
+ ### Renamed
11
+
12
+ - **Package renamed from ``curio`` to ``vouch``** to avoid conflict with the
13
+ existing ``curio`` async library on PyPI. The old ``CurioError`` exception
14
+ is kept as a back-compat alias of ``VouchError`` and will be removed in
15
+ v1.0. Update your imports::
16
+
17
+ # before
18
+ from curio import SearchEngine
19
+ # after
20
+ from vouch import SearchEngine
21
+
22
+ ### Added (continued)
23
+
24
+ - **Browser pool** — one long-lived Chromium process per engine, shared
25
+ across every search. Eliminates the per-call launch overhead (~3-8 s warm,
26
+ worse cold) and the Windows stability issues from forking many Chromium
27
+ instances. Opt-in via ``use_browser_pool=True`` (default on); set False to
28
+ fall back to the v0.1 "fresh browser per search" path. Engine adds
29
+ ``close()`` / context-manager protocol for explicit teardown.
30
+ - **Plugin model via entry_points** — three discovery groups:
31
+ - ``vouch.adapters`` — per-host SiteAdapter implementations
32
+ (``arxiv.org`` exact, ``*.gov.br`` suffix, or ``*`` fallback).
33
+ - ``vouch.routers`` — alternative router strategies.
34
+ - ``vouch.profiles`` — community ProfileRegistry bundles.
35
+ Third parties can ``pip install vouch-adapter-arxiv`` and the next
36
+ ``SearchEngine`` picks it up. See ``docs/plugins.md`` for the contract.
37
+ CLI: ``vouch plugins list``.
38
+ - **Profile auto-update** — ``vouch profiles update`` fetches the latest
39
+ community registry from a configurable URL (default
40
+ ``github.com/evertonsjjj/vouch-profiles``), validates the YAML, and merges
41
+ it on top of the bundled ``builtin.yaml``. Honors HTTP caching
42
+ (ETag / If-Modified-Since) and falls back gracefully to the bundled
43
+ profiles on any network failure.
44
+ - **Tesseract OCR fallback** for text CAPTCHAs (``vouch[ocr]``). Classical
45
+ CPU OCR — ~50-200 ms per image, $0, no GPU, no model download. The
46
+ ``CaptchaSolver`` now chains automatically: Tesseract first → vision LLM
47
+ on low confidence → return best result. Image-grid CAPTCHAs still need a
48
+ vision LLM (``ollama/qwen2.5vl:7b`` recommended). ``CaptchaResult`` gains
49
+ a ``solver`` field showing which backend produced the answer.
50
+
51
+ ### Added
52
+
53
+ - **CSS selector pinning** — the result-extraction LLM now examines DOM context
54
+ (ancestor tag chain, sibling tags, full HTML of one candidate card) and emits
55
+ reusable CSS selector tuples (`container`, `title`, `url`, `snippet`, `date`,
56
+ `author`). Subsequent calls replay via `lxml.cssselect` — deterministic,
57
+ no LLM call. Cached in `selectors.db`.
58
+ - **Auto-escalation chain** — adapter ladder (`http` → `browser` → `stealth`).
59
+ Each search records `working_tier` and `failed_tiers` per site; the next
60
+ call starts at the cheapest tier known to work for that domain. When the
61
+ current tier returns chunks but they look like nav/megamenu, the engine
62
+ keeps escalating instead of accepting the junk.
63
+ - **Auto-DNS resolution** — `engine.add(Site("foo.es"), ...)` with
64
+ `auto_resolve_dns=True` probes a short list of canonical hostname variants
65
+ (`www.`, `sede.`, `agencia.`, `<root>.gob.es`, `<root>.gov.br`, …) and
66
+ picks the one that responds. Fixes `agenciatributaria.es` →
67
+ `sede.agenciatributaria.gob.es` automatically.
68
+ - **Smarter quality detector** — `looks_low_quality()` now flags megamenu
69
+ patterns, recursive search-page links, "no results" / "nenhum resultado" /
70
+ "no se encontraron" sentinels in HTML, and short categorical titles.
71
+ - **Probe crawl on add()** — opt-in `auto_probe_on_add=True` runs a tiny
72
+ probe query the moment a site is added so the engine learns its
73
+ working_tier and selectors before any real user query.
74
+ - **Profile registry** — bundled `vouch/profiles/builtin.yaml` ships with
75
+ curated profiles for 24 popular sites (arxiv, github, huggingface, pypi,
76
+ npmjs, crates, MDN, Wikipedia ×3, gov.uk, irs.gov, sede.agenciatributaria,
77
+ jusbrasil, planalto, BBC, Folha, El País, Stack Overflow, Reddit, …).
78
+ New CLI commands: `vouch profiles list/show/import`.
79
+ - **Accept-Language header** — query language detected (PT/ES/EN/FR/IT/DE)
80
+ and matching `Accept-Language` is sent on HTTP fetches. Reduces redirects
81
+ to wrong-language site versions.
82
+ - **Result formatting helpers** — `SearchResult.to_markdown()`,
83
+ `to_json()`, `to_dict()` for clean rendering in chat / docs / files.
84
+ - **Async API** — `engine.asearch(query, ...)` returns a `SearchResult`
85
+ awaitable, friendly for agent frameworks.
86
+ - **`SearchResult.quality_warning`** — populated when extracted chunks pass
87
+ the heuristic but `looks_low_quality()` flags them, so callers know
88
+ *something* but it's probably nav/shell.
89
+ - **Browser stability on Windows** — process-wide
90
+ `threading.Semaphore(_MAX_PARALLEL_BROWSERS=1)` gates concurrent Chromium
91
+ launches; cleanup is now exception-safe.
92
+ - **57 unit tests** covering catalog, router, engine, cache, extraction,
93
+ CSS selectors, quality detector, language detection, DNS resolver, models.
94
+
95
+ ### Changed
96
+
97
+ - `Site.__init__` now accepts a positional URL (`Site("cvm.gov.br")`),
98
+ matching the README's documented API.
99
+ - `build_adapter` prefers `HTTPAdapter` whenever a `search_url_template` is
100
+ set (10× faster) — falls back to `BrowserAdapter` otherwise.
101
+ - `BrowserAdapter` waits for `networkidle` after `domcontentloaded` so
102
+ XHR-rendered results pages are captured.
103
+ - `_adapter_ladder` skips the `stealth` tier automatically when `patchright`
104
+ isn't installed — avoids re-running the plain BrowserAdapter twice.
105
+ - Heuristic extractor's host filter is now subdomain-aware
106
+ (`developer.mozilla.org` rejects links to `www.mozilla.org`).
107
+ - Selector cache is always truthy (`__bool__ → True`); fixes a fresh-cache
108
+ bug where `if self.cache and selectors:` evaluated False on empty cache.
109
+
110
+ ### Bug fixes
111
+
112
+ - CLI `--version` no longer requires a subcommand to short-circuit.
113
+ - `to_chunks` (HTTPAdapter path) now calls the same nav-anchor filter as
114
+ the BrowserAdapter path; `_split_into_result_chunks` removed.
115
+
116
+ ## [0.1.0] — initial release
117
+
118
+ - Three-level API (one-shot `search()`, `SearchEngine`, YAML catalog).
119
+ - Sync engine, parallel-site fetcher, LLM router with strategies
120
+ (`llm`, `embedding`, `tags`, `all`).
121
+ - HTTP and Browser (Playwright) adapters; Patchright stealth optional.
122
+ - LLM-powered search-bar discovery + selector cache.
123
+ - LLM result-extraction fallback with URL-pattern cache.
124
+ - Catalog (SQLite) + Site model.
125
+ - CLI (`search`, `catalog`, `serve`, `mcp`).
126
+ - FastAPI dashboard.
127
+ - CrewAI / LangChain / PydanticAI / MCP integrations.
128
+ - Optional vision-LLM CAPTCHA solver, APScheduler change monitor.
129
+
130
+ [0.2.0]: https://github.com/evertonsjjj/vouch/releases/tag/v0.2.0
131
+ [0.1.0]: https://github.com/evertonsjjj/vouch/releases/tag/v0.1.0
@@ -0,0 +1,33 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our pledge
4
+
5
+ We pledge to make participation in the vouch community a harassment-free
6
+ experience for everyone, regardless of age, body size, visible or invisible
7
+ disability, ethnicity, sex characteristics, gender identity and expression,
8
+ level of experience, education, socio-economic status, nationality, personal
9
+ appearance, race, religion, or sexual identity and orientation.
10
+
11
+ ## Standards
12
+
13
+ Examples of positive behavior:
14
+
15
+ - Demonstrating empathy and kindness toward other people
16
+ - Being respectful of differing opinions, viewpoints, and experiences
17
+ - Giving and gracefully accepting constructive feedback
18
+
19
+ Unacceptable behavior:
20
+
21
+ - Sexualized language or imagery
22
+ - Trolling, insulting, or derogatory comments
23
+ - Public or private harassment
24
+ - Publishing others' private information without explicit permission
25
+
26
+ ## Enforcement
27
+
28
+ Instances of abusive behavior may be reported to the project maintainers
29
+ at the repository's `SECURITY.md`-listed contact. All complaints will be
30
+ reviewed and investigated promptly and fairly.
31
+
32
+ This code of conduct is adapted from the
33
+ [Contributor Covenant](https://www.contributor-covenant.org), version 2.1.
@@ -0,0 +1,45 @@
1
+ # Contributing to vouch
2
+
3
+ Thanks for considering a contribution. vouch is an early-stage project — issues, PRs, and ideas are all welcome.
4
+
5
+ ## Development setup
6
+
7
+ ```bash
8
+ git clone https://github.com/evertonsjjj/vouch
9
+ cd vouch
10
+ python -m venv .venv
11
+ source .venv/bin/activate # Windows: .venv\Scripts\activate
12
+ pip install -e ".[dev,all]"
13
+ playwright install chromium
14
+ pytest
15
+ ```
16
+
17
+ ## Project layout
18
+
19
+ See the [Architecture](README.md#architecture) section of the README. Each major component is a `Protocol` you can replace — keep that contract in mind when adding features.
20
+
21
+ ## Style
22
+
23
+ - `ruff` for linting and formatting (`ruff check . && ruff format .`).
24
+ - `mypy` for type-checking the core modules.
25
+ - Docstrings on public API. No comment spam internally.
26
+ - Tests for every new public function or protocol implementation.
27
+
28
+ ## Commit / PR conventions
29
+
30
+ - One logical change per PR.
31
+ - Reference an issue when one exists.
32
+ - Run `pytest` and `ruff check .` before pushing.
33
+ - Keep `README.md` in sync when public API changes.
34
+
35
+ ## Areas we want help with
36
+
37
+ - New `SiteAdapter` implementations (per-site optimizations).
38
+ - New `Router` strategies.
39
+ - Integrations with other agent frameworks.
40
+ - Translations (English / Português / Español).
41
+ - Real-world catalogs as YAML examples (regulatory, academic, news).
42
+
43
+ ## Code of conduct
44
+
45
+ Be kind. Be specific. Assume good faith. Reviewers and contributors give their time freely — make their job easier with clear context.
vouch-0.2.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 curio contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.