docpull 5.5.1__tar.gz → 6.0.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 (216) hide show
  1. {docpull-5.5.1/src/docpull.egg-info → docpull-6.0.0}/PKG-INFO +230 -145
  2. {docpull-5.5.1 → docpull-6.0.0}/README.md +215 -136
  3. {docpull-5.5.1 → docpull-6.0.0}/pyproject.toml +26 -15
  4. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/__init__.py +48 -47
  5. docpull-6.0.0/src/docpull/agent_publish.py +185 -0
  6. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/auth_cli.py +87 -0
  7. docpull-6.0.0/src/docpull/basis.py +424 -0
  8. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/benchmark.py +4 -5
  9. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/cli.py +115 -125
  10. docpull-6.0.0/src/docpull/context_aliases.py +132 -0
  11. docpull-6.0.0/src/docpull/context_ci.py +824 -0
  12. docpull-6.0.0/src/docpull/context_packs/__init__.py +35 -0
  13. docpull-5.5.1/src/docpull/context_packs/cli.py → docpull-6.0.0/src/docpull/context_packs/_legacy_cli.py +8 -39
  14. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/context_packs/brand.py +114 -7
  15. docpull-6.0.0/src/docpull/context_packs/cli.py +310 -0
  16. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/context_packs/common.py +12 -0
  17. docpull-6.0.0/src/docpull/context_packs/dataset.py +311 -0
  18. docpull-6.0.0/src/docpull/context_packs/feed.py +919 -0
  19. docpull-6.0.0/src/docpull/context_packs/openapi.py +519 -0
  20. docpull-6.0.0/src/docpull/context_packs/package.py +377 -0
  21. docpull-6.0.0/src/docpull/context_packs/paper.py +572 -0
  22. docpull-6.0.0/src/docpull/context_packs/repo.py +831 -0
  23. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/context_packs/schema_extract.py +111 -14
  24. docpull-6.0.0/src/docpull/context_packs/standards.py +459 -0
  25. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/context_packs/styleguide.py +4 -2
  26. docpull-6.0.0/src/docpull/context_packs/transcript.py +276 -0
  27. docpull-6.0.0/src/docpull/context_packs/typed.py +533 -0
  28. docpull-6.0.0/src/docpull/context_packs/typed_models.py +81 -0
  29. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/context_packs/visuals.py +13 -9
  30. docpull-6.0.0/src/docpull/context_packs/wiki.py +447 -0
  31. docpull-6.0.0/src/docpull/conversion/article_cleanup.py +115 -0
  32. docpull-6.0.0/src/docpull/conversion/ensemble.py +178 -0
  33. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/core/fetcher.py +7 -1
  34. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery/contracts.py +111 -1
  35. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/doctor.py +40 -11
  36. docpull-6.0.0/src/docpull/document_parse.py +643 -0
  37. docpull-6.0.0/src/docpull/eval_grade.py +1375 -0
  38. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/exports.py +30 -4
  39. docpull-6.0.0/src/docpull/free_core.py +2168 -0
  40. docpull-6.0.0/src/docpull/free_core_smoke.py +474 -0
  41. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/http/client.py +65 -11
  42. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/judge.py +4 -10
  43. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/local_workflows.py +66 -4
  44. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/mcp/server.py +14 -1158
  45. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/mcp/sources.py +0 -1
  46. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/models/config.py +11 -2
  47. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/models/document.py +33 -2
  48. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/models/profiles.py +2 -2
  49. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/models/run.py +1 -1
  50. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/monitor.py +275 -4
  51. docpull-6.0.0/src/docpull/output_contract.py +707 -0
  52. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pack_reader.py +60 -2
  53. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pack_tools.py +625 -16
  54. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/parallel_workflows.py +1 -1
  55. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/manifest.py +22 -4
  56. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/convert.py +24 -2
  57. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/save.py +3 -0
  58. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/save_json.py +6 -2
  59. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/save_ndjson.py +3 -0
  60. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/save_okf.py +3 -0
  61. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/save_sqlite.py +136 -49
  62. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/policy.py +14 -1
  63. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/policy_cli.py +20 -0
  64. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/project.py +846 -8
  65. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/provider_cli.py +1 -1
  66. docpull-6.0.0/src/docpull/redaction.py +428 -0
  67. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/rendering.py +14 -13
  68. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/source_scoring.py +91 -4
  69. docpull-6.0.0/src/docpull/surface.py +339 -0
  70. {docpull-5.5.1 → docpull-6.0.0/src/docpull.egg-info}/PKG-INFO +230 -145
  71. {docpull-5.5.1 → docpull-6.0.0}/src/docpull.egg-info/SOURCES.txt +42 -1
  72. {docpull-5.5.1 → docpull-6.0.0}/src/docpull.egg-info/requires.txt +16 -8
  73. {docpull-5.5.1 → docpull-6.0.0}/tests/test_auth_cli.py +53 -0
  74. docpull-6.0.0/tests/test_basis.py +59 -0
  75. {docpull-5.5.1 → docpull-6.0.0}/tests/test_benchmark.py +10 -2
  76. {docpull-5.5.1 → docpull-6.0.0}/tests/test_cache_conditional_get.py +2 -2
  77. {docpull-5.5.1 → docpull-6.0.0}/tests/test_ci_policy.py +2 -1
  78. docpull-6.0.0/tests/test_claim_audit_script.py +74 -0
  79. {docpull-5.5.1 → docpull-6.0.0}/tests/test_cli.py +58 -21
  80. docpull-6.0.0/tests/test_context_ci.py +487 -0
  81. {docpull-5.5.1 → docpull-6.0.0}/tests/test_context_packs.py +172 -22
  82. {docpull-5.5.1 → docpull-6.0.0}/tests/test_convert_step_new.py +47 -0
  83. {docpull-5.5.1 → docpull-6.0.0}/tests/test_discovery_contracts.py +17 -2
  84. {docpull-5.5.1 → docpull-6.0.0}/tests/test_doctor.py +43 -2
  85. docpull-6.0.0/tests/test_document_parse.py +133 -0
  86. {docpull-5.5.1 → docpull-6.0.0}/tests/test_evidence_pack.py +22 -0
  87. {docpull-5.5.1 → docpull-6.0.0}/tests/test_exports.py +19 -0
  88. docpull-6.0.0/tests/test_extractor_ensemble.py +64 -0
  89. docpull-6.0.0/tests/test_feed_pack.py +250 -0
  90. docpull-6.0.0/tests/test_free_core.py +929 -0
  91. {docpull-5.5.1 → docpull-6.0.0}/tests/test_integration.py +1 -1
  92. {docpull-5.5.1 → docpull-6.0.0}/tests/test_judge.py +1 -1
  93. docpull-6.0.0/tests/test_live_web_smoke.py +75 -0
  94. {docpull-5.5.1 → docpull-6.0.0}/tests/test_local_workflows.py +1 -1
  95. {docpull-5.5.1 → docpull-6.0.0}/tests/test_mcp_server.py +13 -123
  96. {docpull-5.5.1 → docpull-6.0.0}/tests/test_mcp_tools.py +1 -1
  97. docpull-6.0.0/tests/test_openapi_pack.py +114 -0
  98. docpull-6.0.0/tests/test_optional_extras_installed.py +144 -0
  99. docpull-6.0.0/tests/test_output_contract.py +119 -0
  100. {docpull-5.5.1 → docpull-6.0.0}/tests/test_outputs_e2e.py +2 -1
  101. {docpull-5.5.1 → docpull-6.0.0}/tests/test_pack_tools.py +239 -0
  102. {docpull-5.5.1 → docpull-6.0.0}/tests/test_parallel_workflows.py +19 -12
  103. {docpull-5.5.1 → docpull-6.0.0}/tests/test_parity_workflows.py +13 -2
  104. {docpull-5.5.1 → docpull-6.0.0}/tests/test_policy.py +8 -0
  105. {docpull-5.5.1 → docpull-6.0.0}/tests/test_project.py +148 -0
  106. {docpull-5.5.1 → docpull-6.0.0}/tests/test_provider_cli.py +11 -1
  107. {docpull-5.5.1 → docpull-6.0.0}/tests/test_provider_keys.py +11 -1
  108. {docpull-5.5.1 → docpull-6.0.0}/tests/test_provider_probes.py +11 -1
  109. docpull-6.0.0/tests/test_public_feature_smoke.py +446 -0
  110. docpull-6.0.0/tests/test_real_feature_smoke_script.py +172 -0
  111. {docpull-5.5.1 → docpull-6.0.0}/tests/test_real_site_regressions.py +42 -0
  112. docpull-6.0.0/tests/test_release_a_plus_check_script.py +124 -0
  113. {docpull-5.5.1 → docpull-6.0.0}/tests/test_rendering.py +13 -12
  114. {docpull-5.5.1 → docpull-6.0.0}/tests/test_save_ndjson.py +1 -1
  115. {docpull-5.5.1 → docpull-6.0.0}/tests/test_save_sqlite.py +1 -1
  116. {docpull-5.5.1 → docpull-6.0.0}/tests/test_security_hardening.py +66 -0
  117. docpull-6.0.0/tests/test_source_scoring.py +40 -0
  118. docpull-6.0.0/tests/test_surface_contract.py +217 -0
  119. docpull-6.0.0/tests/test_typed_knowledge_packs.py +770 -0
  120. docpull-5.5.1/src/docpull/context_packs/__init__.py +0 -20
  121. docpull-5.5.1/tests/test_surface_contract.py +0 -221
  122. {docpull-5.5.1 → docpull-6.0.0}/LICENSE +0 -0
  123. {docpull-5.5.1 → docpull-6.0.0}/setup.cfg +0 -0
  124. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/__main__.py +0 -0
  125. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/accounting.py +0 -0
  126. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/cache/__init__.py +0 -0
  127. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/cache/frontier.py +0 -0
  128. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/cache/manager.py +0 -0
  129. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/cache/streaming_dedup.py +0 -0
  130. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/context_packs/product.py +0 -0
  131. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/context_packs/search.py +0 -0
  132. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/conversion/__init__.py +0 -0
  133. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/conversion/chunking.py +0 -0
  134. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/conversion/extractor.py +0 -0
  135. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/conversion/filings.py +0 -0
  136. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/conversion/markdown.py +0 -0
  137. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/conversion/protocols.py +0 -0
  138. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/conversion/special_cases.py +0 -0
  139. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/conversion/trafilatura_extractor.py +0 -0
  140. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/core/__init__.py +0 -0
  141. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery/__init__.py +0 -0
  142. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery/_fetch.py +0 -0
  143. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery/composite.py +0 -0
  144. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery/crawler.py +0 -0
  145. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery/filters.py +0 -0
  146. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery/link_extractors/__init__.py +0 -0
  147. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery/link_extractors/enhanced.py +0 -0
  148. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery/link_extractors/protocols.py +0 -0
  149. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery/link_extractors/static.py +0 -0
  150. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery/protocols.py +0 -0
  151. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery/sitemap.py +0 -0
  152. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/discovery_cli.py +0 -0
  153. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/evidence_pack.py +0 -0
  154. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/fixtures/__init__.py +0 -0
  155. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/fixtures/parallel-search-extract.json +0 -0
  156. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/graph.py +0 -0
  157. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/hosted.py +0 -0
  158. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/http/__init__.py +0 -0
  159. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/http/protocols.py +0 -0
  160. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/http/rate_limiter.py +0 -0
  161. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/mcp/__init__.py +0 -0
  162. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/mcp/tools.py +0 -0
  163. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/metadata_extractor.py +0 -0
  164. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/models/__init__.py +0 -0
  165. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/models/events.py +0 -0
  166. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/parity.py +0 -0
  167. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/parity_cli.py +0 -0
  168. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/passk.py +0 -0
  169. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/__init__.py +0 -0
  170. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/base.py +0 -0
  171. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/__init__.py +0 -0
  172. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/chunk.py +0 -0
  173. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/dedup.py +0 -0
  174. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/fetch.py +0 -0
  175. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/metadata.py +0 -0
  176. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/render.py +0 -0
  177. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/pipeline/steps/validate.py +0 -0
  178. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/provider_adapters.py +0 -0
  179. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/provider_capabilities.py +0 -0
  180. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/provider_keys.py +0 -0
  181. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/provider_probes.py +0 -0
  182. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/py.typed +0 -0
  183. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/scraper.py +0 -0
  184. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/security/__init__.py +0 -0
  185. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/security/download_policy.py +0 -0
  186. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/security/robots.py +0 -0
  187. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/security/url_validator.py +0 -0
  188. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/server.py +0 -0
  189. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/share.py +0 -0
  190. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/skill_export.py +0 -0
  191. {docpull-5.5.1 → docpull-6.0.0}/src/docpull/time_utils.py +0 -0
  192. {docpull-5.5.1 → docpull-6.0.0}/src/docpull.egg-info/dependency_links.txt +0 -0
  193. {docpull-5.5.1 → docpull-6.0.0}/src/docpull.egg-info/entry_points.txt +0 -0
  194. {docpull-5.5.1 → docpull-6.0.0}/src/docpull.egg-info/top_level.txt +0 -0
  195. {docpull-5.5.1 → docpull-6.0.0}/tests/test_accounting.py +0 -0
  196. {docpull-5.5.1 → docpull-6.0.0}/tests/test_chunking.py +0 -0
  197. {docpull-5.5.1 → docpull-6.0.0}/tests/test_conversion.py +0 -0
  198. {docpull-5.5.1 → docpull-6.0.0}/tests/test_discovery.py +0 -0
  199. {docpull-5.5.1 → docpull-6.0.0}/tests/test_document_record.py +0 -0
  200. {docpull-5.5.1 → docpull-6.0.0}/tests/test_frontier_resume.py +0 -0
  201. {docpull-5.5.1 → docpull-6.0.0}/tests/test_graph.py +0 -0
  202. {docpull-5.5.1 → docpull-6.0.0}/tests/test_hosted.py +0 -0
  203. {docpull-5.5.1 → docpull-6.0.0}/tests/test_link_extractors.py +0 -0
  204. {docpull-5.5.1 → docpull-6.0.0}/tests/test_metadata_extractor.py +0 -0
  205. {docpull-5.5.1 → docpull-6.0.0}/tests/test_monitor.py +0 -0
  206. {docpull-5.5.1 → docpull-6.0.0}/tests/test_naming.py +0 -0
  207. {docpull-5.5.1 → docpull-6.0.0}/tests/test_pack_server.py +0 -0
  208. {docpull-5.5.1 → docpull-6.0.0}/tests/test_passk.py +0 -0
  209. {docpull-5.5.1 → docpull-6.0.0}/tests/test_pipeline.py +0 -0
  210. {docpull-5.5.1 → docpull-6.0.0}/tests/test_policy_cli.py +0 -0
  211. {docpull-5.5.1 → docpull-6.0.0}/tests/test_provider_adapters.py +0 -0
  212. {docpull-5.5.1 → docpull-6.0.0}/tests/test_rate_limiter.py +0 -0
  213. {docpull-5.5.1 → docpull-6.0.0}/tests/test_share.py +0 -0
  214. {docpull-5.5.1 → docpull-6.0.0}/tests/test_special_cases.py +0 -0
  215. {docpull-5.5.1 → docpull-6.0.0}/tests/test_time_utils.py +0 -0
  216. {docpull-5.5.1 → docpull-6.0.0}/tests/test_trafilatura_extractor.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docpull
3
- Version: 5.5.1
4
- Summary: Keep AI agents synced with changing public docs and web sources
3
+ Version: 6.0.0
4
+ Summary: Declare, sync, diff, and lock context dependencies for AI agents
5
5
  Author-email: Zachary Roth <support@raintree.technology>
6
6
  Maintainer-email: Raintree Technology <support@raintree.technology>
7
7
  License-Expression: MIT
@@ -15,7 +15,7 @@ Project-URL: MCP Plugin, https://github.com/raintree-technology/docpull/tree/mai
15
15
  Project-URL: Comparison Guide, https://github.com/raintree-technology/docpull/blob/main/docs/alternatives.md
16
16
  Project-URL: Download Stats, https://pepy.tech/project/docpull
17
17
  Project-URL: Changelog, https://github.com/raintree-technology/docpull/blob/main/docs/CHANGELOG.md
18
- Keywords: python,markdown,documentation,web,website,web-extraction,web-to-markdown,web-scraping,web-crawler,crawler,content-extraction,developer-tools,cli,rag,llm,mcp,ai-agents,context-engineering,source-packs,research,claude,ai-training-data
18
+ Keywords: python,markdown,documentation,web,website,web-extraction,web-to-markdown,source-ingestion,provenance,context-ci,content-extraction,developer-tools,cli,rag,llm,mcp,ai-agents,context-engineering,context-dependencies,context-packs,source-packs,research,claude,ai-training-data
19
19
  Classifier: Development Status :: 5 - Production/Stable
20
20
  Classifier: Intended Audience :: Developers
21
21
  Classifier: Intended Audience :: Information Technology
@@ -68,12 +68,17 @@ Requires-Dist: python-multipart>=0.0.27; extra == "mcp"
68
68
  Requires-Dist: starlette>=1.3.1; extra == "mcp"
69
69
  Provides-Extra: serve
70
70
  Requires-Dist: uvicorn>=0.30.0; extra == "serve"
71
- Provides-Extra: parallel
72
- Requires-Dist: parallel-web>=1.0.1; extra == "parallel"
73
- Provides-Extra: observability
74
- Requires-Dist: raindrop-ai>=0.0.50; extra == "observability"
75
71
  Provides-Extra: parquet
76
72
  Requires-Dist: pyarrow>=16.0.0; extra == "parquet"
73
+ Provides-Extra: markitdown
74
+ Requires-Dist: markitdown>=0.1.0; extra == "markitdown"
75
+ Provides-Extra: unstructured
76
+ Requires-Dist: unstructured[all-docs]>=0.16.0; extra == "unstructured"
77
+ Provides-Extra: parse
78
+ Requires-Dist: markitdown>=0.1.0; extra == "parse"
79
+ Requires-Dist: unstructured[all-docs]>=0.16.0; extra == "parse"
80
+ Provides-Extra: presidio
81
+ Requires-Dist: presidio-analyzer>=2.2.0; extra == "presidio"
77
82
  Provides-Extra: e2b
78
83
  Requires-Dist: e2b>=2.0.0; extra == "e2b"
79
84
  Provides-Extra: llm
@@ -90,9 +95,10 @@ Requires-Dist: pyjwt>=2.13.0; extra == "all"
90
95
  Requires-Dist: python-multipart>=0.0.27; extra == "all"
91
96
  Requires-Dist: starlette>=1.3.1; extra == "all"
92
97
  Requires-Dist: uvicorn>=0.30.0; extra == "all"
93
- Requires-Dist: parallel-web>=1.0.1; extra == "all"
94
- Requires-Dist: raindrop-ai>=0.0.50; extra == "all"
95
98
  Requires-Dist: pyarrow>=16.0.0; extra == "all"
99
+ Requires-Dist: markitdown>=0.1.0; extra == "all"
100
+ Requires-Dist: unstructured[all-docs]>=0.16.0; extra == "all"
101
+ Requires-Dist: presidio-analyzer>=2.2.0; extra == "all"
96
102
  Requires-Dist: e2b>=2.0.0; extra == "all"
97
103
  Provides-Extra: dev
98
104
  Requires-Dist: pytest>=7.0.0; extra == "dev"
@@ -112,7 +118,7 @@ Dynamic: license-file
112
118
 
113
119
  # docpull
114
120
 
115
- **Keep AI agents synced with changing public docs. Browser-free by default.**
121
+ **Context dependencies for AI agents. Browser-free by default.**
116
122
 
117
123
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
118
124
  [![PyPI version](https://img.shields.io/pypi/v/docpull.svg?label=package)](https://pypi.org/project/docpull/)
@@ -120,10 +126,36 @@ Dynamic: license-file
120
126
  [![GitHub stars](https://img.shields.io/github/stars/raintree-technology/docpull?style=social)](https://github.com/raintree-technology/docpull/stargazers)
121
127
  [![License: MIT](https://img.shields.io/github/license/raintree-technology/docpull)](https://github.com/raintree-technology/docpull/blob/main/LICENSE)
122
128
 
123
- DocPull turns public docs and web sources into refreshable, cited, agent-ready
124
- context packs. Define source sets once, sync them over time, diff what changed,
125
- and export fresh context for Cursor, Claude, Codex, OpenAI, LlamaIndex,
126
- LangChain, MCP clients, and RAG pipelines.
129
+ DocPull is a local-first dependency manager for AI context. Define the public
130
+ docs and web sources an agent depends on, sync them into cited context packs,
131
+ diff what changed, and export reproducible context for Cursor, Claude, Codex,
132
+ OpenAI, LlamaIndex, LangChain, MCP clients, and RAG pipelines.
133
+
134
+ The core workflow is a `docpull.yaml` plus a `.docpull/context.lock.json`,
135
+ similar in spirit to code dependency manifests and lockfiles:
136
+
137
+ ```bash
138
+ docpull init my-agent-context
139
+ docpull add stripe react postgres
140
+ docpull install
141
+ docpull deps
142
+ docpull sync
143
+ docpull diff
144
+ docpull export context-pack --target codex
145
+ ```
146
+
147
+ Bundled aliases such as `stripe`, `react`, `postgres`, `openai`, and
148
+ `apple-hig` expand to normal HTTPS sources in `docpull.yaml`. Runs stay
149
+ reproducible through the lockfile: source URLs, discovered URLs, content hashes,
150
+ run IDs, aliases, and export metadata are recorded without storing secrets.
151
+ Use `docpull sources list` to inspect the bundled alias catalog and
152
+ `docpull install` to validate or recreate the local dependency lock.
153
+ Use `docpull deps` to see the current dependency, lockfile, latest run, and
154
+ export status.
155
+
156
+ Projects can also track typed known-source specs such as `pypi:requests`,
157
+ `rfc:9110`, `wiki:Web_scraping`, or a local dataset path. Those sources sync
158
+ through their typed lanes and do not use discovery.
127
159
 
128
160
  The original `docpull URL ...` workflow still works: fetch public or explicitly
129
161
  authorized static/server-rendered web pages and write clean Markdown, NDJSON,
@@ -131,14 +163,15 @@ SQLite, or OKF outputs. Project mode adds the persistent evidence lifecycle on
131
163
  top: sources, runs, diffs, exports, evals, accounting, and local auditability.
132
164
 
133
165
  DocPull is local-first: direct fetching, sitemap/link discovery, extraction,
134
- indexing, pack intelligence, and local `agent-browser` rendering can run with no
135
- provider account and no required API spend. Tavily, Exa, Parallel, and cloud
136
- renderers are optional escalation paths when local and open-source routes are
137
- not enough.
166
+ indexing, pack intelligence, and opt-in `agent-browser` rendering can run with
167
+ no external account and no required API spend. Cloud rendering is explicit and
168
+ budget-guarded.
138
169
 
139
- DocPull exposes the same core workflows through CLI, Python SDK, and MCP, with
140
- each surface optimized for its user. The [Surface Contract](docs/surface-contract.md)
141
- defines how those surfaces align and where they intentionally differ.
170
+ DocPull aligns core workflows across CLI, Python SDK, and MCP, with each surface
171
+ optimized for its user. The [Surface Contract](docs/surface-contract.md) defines
172
+ how those surfaces align and where they intentionally differ.
173
+ For the context dependency workflow, see
174
+ [Context Dependencies](docs/context-dependencies.md).
142
175
 
143
176
  Web-source ingestion is the core workflow. Documentation is one high-value
144
177
  lane, not the product boundary. It works best on static or server-rendered
@@ -146,9 +179,9 @@ pages such as blogs, API references, OpenAPI specs, changelogs, vendor pages,
146
179
  product pages, filings, docs sites, and other pages where the useful content is
147
180
  available in HTML or embedded page data.
148
181
 
149
- docpull is browser-free by default. JS-only pages are skipped with a clear
150
- reason unless you explicitly opt into the local `agent-browser` renderer. See
151
- [Scraping Boundary](docs/scraping-boundary.md) and
182
+ DocPull is browser-free by default. JS-only pages are skipped with a clear
183
+ reason unless you explicitly opt into a local renderer. See
184
+ [Web Source Boundary](docs/scraping-boundary.md) and
152
185
  [Alternatives](docs/alternatives.md) for the full boundary.
153
186
 
154
187
  ## Install
@@ -161,12 +194,50 @@ pip install docpull
161
194
 
162
195
  ```bash
163
196
  docpull init stripe-docs
164
- docpull add https://docs.stripe.com
197
+ docpull add stripe
198
+ docpull install
165
199
  docpull sync
200
+ docpull deps
166
201
  docpull diff
167
202
  docpull export context-pack --target cursor
168
203
  ```
169
204
 
205
+ ## Context CI
206
+
207
+ Use Context CI when an agent loop depends on current, cited context and a
208
+ missing or stale source should fail the build:
209
+
210
+ ```bash
211
+ docpull ci --prepare
212
+ ```
213
+
214
+ `docpull ci` runs locally against either a project root or a standalone pack. It
215
+ checks the project lockfile, pack score, pack audit, coverage confidence,
216
+ citation coverage, eval-grade sidecars, evidence basis quality, rights
217
+ metadata, and optional context predictions. It writes `context-ci.report.json` and `CONTEXT_CI.md`;
218
+ the command exits non-zero when hard gates fail.
219
+
220
+ Minimal GitHub Actions job:
221
+
222
+ ```yaml
223
+ name: Context CI
224
+ on: [pull_request]
225
+ jobs:
226
+ context:
227
+ runs-on: ubuntu-latest
228
+ steps:
229
+ - uses: actions/checkout@v4
230
+ - uses: actions/setup-python@v5
231
+ with:
232
+ python-version: "3.11"
233
+ - run: pip install docpull
234
+ - run: docpull ci --prepare
235
+ ```
236
+
237
+ For the full workflow, see [Context CI](docs/context-ci.md). The durable
238
+ artifact shape is documented in
239
+ [Context Pack Contract v3](docs/context-pack-contract-v3.md).
240
+
170
241
  Example diff after a later sync:
171
242
 
172
243
  ```text
@@ -185,29 +256,64 @@ Changed pages:
185
256
  0 paid/cloud routes used
186
257
  ```
187
258
 
259
+ ## Context Pack Contract
260
+
261
+ DocPull writes three explicit layers of artifacts:
262
+
263
+ | Layer | Purpose | Contract check |
264
+ | --- | --- | --- |
265
+ | Raw extraction | Fetched documents, chunks, routes, and source index sidecars | `docpull pack validate PACK --level raw` |
266
+ | Agent-ready pack | Raw evidence plus citation index, coverage, score, audit, and lock sidecars | `docpull pack validate PACK --level agent` |
267
+ | Eval-grade pack | Agent pack plus rights, provenance, basis/eval artifacts, and pack card | `docpull pack validate PACK --level eval` |
268
+
269
+ Core ingestion paths write into the same v3 contract:
270
+
271
+ ```bash
272
+ docpull https://docs.example.com -o packs/docs
273
+ docpull parse ./handbook.pdf -o packs/handbook --backend auto
274
+ docpull openapi-pack ./openapi.json -o packs/api
275
+ docpull feed-pack https://example.com/news -o packs/news
276
+ docpull paper-pack arxiv:1706.03762 -o packs/papers
277
+ docpull repo-pack psf/requests -o packs/repo --cache
278
+ docpull package-pack pypi:requests -o packs/package
279
+ docpull standards-pack rfc:9110 -o packs/standard
280
+ docpull dataset-pack ./metrics.csv -o packs/dataset
281
+ docpull transcript-pack ./meeting.vtt -o packs/transcript
282
+ docpull wiki-pack wiki:Web_scraping -o packs/wiki
283
+ docpull pack prepare packs/docs --eval-grade
284
+ docpull pack validate packs/docs --level eval
285
+ docpull export packs/docs --format openai-vector-jsonl -o exports/openai.jsonl
286
+ docpull export packs/docs --format cursor-rules -o .cursor/rules --skill-name docs
287
+ ```
288
+
289
+ Use `docpull ci --prepare` to validate a project or standalone pack in CI.
290
+
188
291
  Install optional extras as needed:
189
292
 
190
293
  ```bash
191
294
  pip install 'docpull[llm]' # tiktoken for token-accurate chunking
192
295
  pip install 'docpull[trafilatura]' # alternative extractor for noisy pages
296
+ pip install 'docpull[parse]' # MarkItDown + Unstructured local document parsers
297
+ pip install 'docpull[presidio]' # optional Presidio PII detection for redaction
193
298
  pip install 'docpull[mcp]' # stdio MCP server
194
299
  pip install 'docpull[serve]' # local pack JSON server runner
195
- pip install 'docpull[parallel]' # Parallel context packs
196
- pip install 'docpull[observability]' # Raindrop benchmark tracing
300
+ pip install 'docpull[parquet]' # optional Parquet export support
197
301
  pip install 'docpull[e2b]' # E2B cloud sandbox renderer SDK
198
- pip install 'docpull[all]' # all optional extras
199
302
  ```
200
303
 
304
+ Prefer installing the extras needed for the current lane instead of a broad
305
+ bundle. The base install remains useful without API keys or paid services.
306
+
201
307
  Browser rendering is an explicit external extension, not part of the base
202
308
  install. Install an `agent-browser` compatible CLI separately, put it on
203
309
  `PATH`, or set `DOCPULL_AGENT_BROWSER_BIN=/path/to/agent-browser`. Verify the
204
310
  runtime with `docpull render --check`. Render targets must use HTTPS except for
205
311
  localhost/loopback HTTP during local testing, and DocPull keeps renderer action
206
- permissions locked down to HTML retrieval only. Because the current
207
- `agent-browser` CLI contract cannot enforce redirect, subresource, or
208
- connect-time DNS allow-lists, network browser rendering fails closed unless the
209
- operator sets `DOCPULL_RENDER_TRUSTED_BROWSER_TARGETS=1` for trusted targets.
210
- For localhost/loopback HTTP tests, set `DOCPULL_RENDER_ALLOW_LOCAL_TARGETS=1`.
312
+ permissions locked down to HTML retrieval only. Because browser rendering
313
+ cannot fully enforce redirect, subresource, or connect-time DNS allow-lists,
314
+ network browser rendering fails closed unless the operator sets
315
+ `DOCPULL_RENDER_TRUSTED_BROWSER_TARGETS=1` for trusted targets. For
316
+ localhost/loopback HTTP tests, set `DOCPULL_RENDER_ALLOW_LOCAL_TARGETS=1`.
211
317
 
212
318
  For stronger isolation, cloud runtimes are available explicitly:
213
319
  `docpull render URL --runtime vercel` uses the Vercel Sandbox CLI and Vercel
@@ -218,56 +324,43 @@ set a local per-render budget guard, and use `--cloud-agent-browser-install skip
218
324
  with a prebuilt sandbox/template that already includes `agent-browser`. For E2B,
219
325
  pass `--template` or set `DOCPULL_E2B_TEMPLATE` to use that prebuilt environment.
220
326
 
327
+ For release acceptance, run the opt-in real-data smoke harness. The default path
328
+ uses public free sources and local tooling; `--include-cloud` also attempts the
329
+ keyed/cloud render lanes when the local environment is configured for them.
330
+ The strict scorecard also requires synchronized generated metadata and a clean
331
+ `git status --short` before tagging.
332
+
333
+ ```bash
334
+ python scripts/release_a_plus_check.py --strict
335
+ python scripts/real_feature_smoke.py --json --full-mcp --strict-ci --auth-matrix --monitor-soak-minutes 10
336
+ python scripts/real_feature_smoke.py --include-cloud --json
337
+ ```
338
+
221
339
  ## Free-First Budgets
222
340
 
223
- Use `--budget 0` when a run must not make paid-capable provider or cloud calls:
341
+ Use `--budget 0` when a run must not make paid-capable cloud calls:
224
342
 
225
343
  ```bash
226
344
  docpull https://docs.example.com --budget 0 -o ./docs/example
227
- docpull discover scan https://docs.example.com -o ./packs/discovery
228
345
  DOCPULL_RENDER_TRUSTED_BROWSER_TARGETS=1 docpull render https://example.com/app --runtime local --budget 0
229
- docpull providers context-pack "Find official docs" --provider all --dry-run --budget 0 --json
230
- docpull benchmark quick --zero-dollar --target-set zero-dollar --provider all
231
346
  ```
232
347
 
233
348
  Under a zero budget, local cache, direct HTTP, sitemap/static-link discovery,
234
349
  local extraction, local indexing, pack analysis, monitors, and local
235
- `agent-browser` rendering for trusted targets remain allowed. Live Tavily, Exa,
236
- Parallel, Vercel Sandbox, and E2B calls are blocked before execution. Runs
237
- involving a budget or paid-capable route write `run.accounting.json` with
238
- non-secret route, cost, HTTP/cache, browser, and blocked-action metadata.
239
-
240
- Use `docpull discover scan URL` to build a provider-free discovery pack from
241
- open site hints: `llms.txt`, RSS/Atom feeds, OpenAPI specs, sitemap indexes,
242
- and public GitHub docs trees. It writes the same `candidate_sources.ndjson`
243
- contract as provider imports and URL/sitemap files, so the next step is still
244
- `docpull discover select` or `docpull discover fetch`.
245
-
246
- When a zero-dollar benchmark or local run is partial, DocPull reports the
247
- lowest-friction escalation path before spending money: trusted-target local
248
- `--render fallback` first, BYOK providers next, and cloud rendering only when
249
- local rendering or infrastructure is the blocker. Benchmark reports include
250
- suggested commands, estimated paid request counts, and estimated paid cost
251
- guards before any provider or cloud call is made.
252
-
253
- The `zero-dollar` benchmark target set is the Phase 2 measurement matrix. It
254
- keeps the existing docs/provider targets and adds JS-heavy docs, pricing,
255
- filings, feeds, sitemaps, and search-to-evidence tasks. The report classifies
256
- each target as `complete_for_0`, `complete_with_local_browser`, `partial_for_0`,
257
- `requires_provider`, `requires_cloud_browser`, or `blocked_by_policy`.
258
-
259
- ## Open Source And Hosted Boundary
260
-
261
- The open-source package owns local fetching, local rendering adapters,
262
- provider-free discovery, extraction, indexing, packs, diffs, monitors, MCP,
263
- BYOK providers, budget policy, accounting, and benchmarks.
264
-
265
- A hosted DocPull product, if offered, should sell managed execution: always-on
266
- schedules, browser/proxy infrastructure, persistent auth profiles, queues,
267
- alerts, dashboards, collaboration, retention, SSO, audit logs, SLAs, and
268
- bundled provider billing. The hosted boundary does not change the OSS default:
269
- no hidden paid calls, no CAPTCHA bypass, no stealth scraping, and no claim of a
270
- proprietary web-scale index.
350
+ browser rendering for trusted targets remain allowed. Vercel Sandbox and E2B
351
+ rendering are blocked before execution. Runs involving a budget or paid-capable
352
+ route write `run.accounting.json` with non-secret route, cost, HTTP/cache,
353
+ browser, and blocked-action metadata.
354
+
355
+ ## Release Boundary
356
+
357
+ The open-source package owns local fetching, explicit rendering adapters,
358
+ source aliases, v3 pack contracts, validation, preparation, exports, Context
359
+ CI, monitors, MCP, budget policy, and accounting.
360
+
361
+ This release does not include a hosted scheduler, browser/proxy service,
362
+ accounts, marketplace, proprietary web index, CAPTCHA bypass, stealth scraping,
363
+ or hidden paid calls.
271
364
 
272
365
  ## Persistent Projects
273
366
 
@@ -304,15 +397,20 @@ docpull review
304
397
  # Create a versioned context-pack release
305
398
  docpull release context-pack --target cursor --tag stripe-docs-v1
306
399
 
307
- # Generate eval cases from changed or latest documents
308
- docpull eval-set --limit 25
309
-
310
400
  # One-command project sync, diff, and export for one source
311
401
  docpull watch https://docs.stripe.com --export cursor --alert changes
312
402
  ```
313
403
 
404
+ Ad hoc `docpull watch` projects are bounded to one page and one level of depth
405
+ by default. Use explicit bounds when the watch should cover more:
406
+
407
+ ```bash
408
+ docpull watch https://docs.stripe.com --export cursor --max-pages 10 --max-depth 2
409
+ ```
410
+
314
411
  `docpull diff` is hash-based and deterministic locally. Optional BYOK semantic
315
- summaries are advisory and skip cleanly when no model key is configured.
412
+ summaries are advisory and skip cleanly when no model key is configured. Each
413
+ diff also writes local semantic categories to `semantic.diff.json`.
316
414
  Use `docpull add URL --discover` or `docpull sync --update-discovery` to
317
415
  refresh and persist discovered source URLs in `docpull.yaml`; sync then uses
318
416
  that stored URL set for repeatable exact refreshes.
@@ -332,14 +430,6 @@ sources:
332
430
  policy: explicit-private
333
431
  ```
334
432
 
335
- The commercial control-plane shape is API-led but not API-only: the local CLI
336
- remains the trust-building engine, while hosted DocPull manages projects, sync
337
- jobs, diffs, exports, releases, and signed webhooks through `/v1` JSON
338
- endpoints. The hosted ASGI MVP lives in `docpull.hosted`; `docpull remote ...`
339
- stores hosted API connection metadata and calls the same project lifecycle
340
- remotely. Remote bearer tokens are sent only to HTTPS API URLs by default;
341
- `--allow-insecure-local-http` is limited to localhost/loopback development.
342
-
343
433
  The launch screenshot for this flow lives at
344
434
  [`docs/launch-assets/docpull-project-diff-demo.png`](docs/launch-assets/docpull-project-diff-demo.png).
345
435
 
@@ -409,31 +499,9 @@ docpull https://sdk.vercel.ai \
409
499
  --skill-description "Vercel AI SDK source reference"
410
500
  ```
411
501
 
412
- Local-first parity workflows mirror common hosted search/extract/crawl/research
413
- API shapes while writing auditable files instead of relying on a hosted index:
414
-
415
- ```bash
416
- # Normalize candidate URLs without fetching content
417
- docpull map urls ./urls.txt -o ./packs/map
418
-
419
- # Extract known URLs into a local pack
420
- docpull extract-pack ./urls.txt -o ./packs/extract
421
-
422
- # Select mapped candidates and fetch them
423
- docpull crawl-pack ./packs/map --select top:10 -o ./packs/crawl
424
-
425
- # Answer/research from an existing local pack with lifecycle artifacts
426
- docpull research-pack ./packs/crawl \
427
- --objective "Summarize auth and webhook behavior" \
428
- --schema ./output.schema.json
429
-
430
- # Build a cited entity/list pack from existing evidence
431
- docpull entities-pack ./packs/crawl --limit 100
432
- ```
433
-
434
502
  More examples live in [CLI Recipes](docs/examples/README.md).
435
503
 
436
- With an explicit `--skill-agent`, docpull stores the scraped corpus under
504
+ With an explicit `--skill-agent`, docpull stores the fetched corpus under
437
505
  `.docpull/skills/<name>/references` and creates agent-specific wrappers that
438
506
  point at that corpus. `--skill-agent claude` writes a Claude Code skill under
439
507
  `.claude/skills/<name>/`, `--skill-agent codex` writes a Codex skill under
@@ -478,6 +546,15 @@ special handling for common web, documentation, and API surfaces.
478
546
  | Static HTML / SSR pages | Extracts article, main, or document regions |
479
547
  | Next.js / Mintlify | Parses static HTML and `__NEXT_DATA__` when available |
480
548
  | OpenAPI / Swagger | Renders specs into Markdown |
549
+ | OpenAPI pack | `docpull openapi-pack` emits endpoint/schema records with v3 sidecars |
550
+ | RSS / Atom / JSON Feed | `docpull feed-pack` emits item-level records, dates, and listing sidecars |
551
+ | Research papers | `docpull paper-pack` emits paper metadata, abstracts, optional local/arXiv PDF full text, and references |
552
+ | Public GitHub repos | `docpull repo-pack` emits repo metadata, README/docs/examples/changelog files, manifests, and releases |
553
+ | npm / PyPI packages | `docpull package-pack` emits registry metadata, README/description, versions, license, dependencies, and install commands |
554
+ | Standards | `docpull standards-pack` emits RFC, IETF, W3C, and WHATWG metadata plus section-level records |
555
+ | Local datasets | `docpull dataset-pack` emits bounded schema, exact row counts where streamable, column, null-count, and sample summaries |
556
+ | Transcripts | `docpull transcript-pack` emits timestamped segment records from VTT, SRT, text, JSON, or direct transcript URLs |
557
+ | Wikimedia / Wikipedia | `docpull wiki-pack` emits MediaWiki REST page metadata, license/revision metadata, and section-level records |
481
558
  | Docusaurus / Sphinx / MkDocs | Extracts static article or document regions |
482
559
  | VitePress / VuePress / Astro Starlight | Extracts static content regions |
483
560
  | GitBook / ReadMe.io | Extracts available article or content regions |
@@ -497,6 +574,23 @@ errors instead of normal skips.
497
574
  | OKF | Portable Open Knowledge Format bundles with indexes and manifests |
498
575
  | Archive / mirror | Cached offline source snapshots |
499
576
 
577
+ All file-backed outputs now write the DocPull output contract v3 raw sidecars:
578
+ `corpus.manifest.json`, `sources.md`, and `acquisition.routes.json`. Use
579
+ `docpull pack validate <pack-dir> --level raw|agent|eval` to check whether a
580
+ pack is raw extraction output, agent-ready context, or eval-grade context.
581
+
582
+ Local files can enter the same contract with the document parse lane:
583
+
584
+ ```bash
585
+ docpull parse ./handbook.pdf -o ./packs/handbook --backend auto
586
+ docpull parse ./handbook.docx -o ./packs/handbook --prepare --eval-grade
587
+ ```
588
+
589
+ `--backend auto` reads plain text/Markdown directly and uses optional
590
+ MarkItDown or Unstructured parsers for complex office/PDF files when installed.
591
+ Install `docpull[markitdown]`, `docpull[unstructured]`, or `docpull[parse]`
592
+ for those backends.
593
+
500
594
  Every file-backed run writes `corpus.manifest.json` with stable document IDs,
501
595
  chunk IDs, hashes, output paths, and chunk counts. See
502
596
  [Corpus Manifest](docs/corpus-manifest.md).
@@ -524,12 +618,17 @@ enabled. It is not the right tool for:
524
618
  - Pages behind CAPTCHA or bot challenges.
525
619
  - Workflows that require clicking, scrolling, or browser state.
526
620
 
527
- For those cases, use browser automation, such as Playwright, then pass rendered
528
- HTML or exported content into your pipeline. For simple public JS-rendered
529
- pages, `docpull render` and `--render fallback` provide an explicit local
530
- fallback without changing the default crawler behavior. The fallback requires
531
- the optional external `agent-browser` backend and
532
- `DOCPULL_RENDER_TRUSTED_BROWSER_TARGETS=1` for trusted network targets.
621
+ For those cases, use full browser automation outside DocPull, then pass
622
+ rendered HTML or exported content into your pipeline. For simple public
623
+ JS-rendered pages, use `docpull render --runtime local` or fetch with
624
+ `--render fallback` for an explicit `agent-browser` fallback without changing
625
+ the default fetch behavior. DocPull does not claim complete browser coverage
626
+ unless rendering is explicitly enabled and available.
627
+
628
+ Use `--extractor ensemble` when a crawl should score multiple local extraction
629
+ candidates and keep the strongest Markdown. The ensemble always includes the
630
+ built-in generic extractor and adds trafilatura when `docpull[trafilatura]` is
631
+ installed.
533
632
 
534
633
  ## How It Compares
535
634
 
@@ -599,41 +698,28 @@ part of the package release contract.
599
698
 
600
699
  ## Advanced Workflows
601
700
 
602
- - `docpull[parallel]` can discover, extract, enrich, score, diff, and archive
603
- live web sources with your own Parallel API key. See
604
- [Parallel Integration](docs/parallel.md).
605
701
  - Local pack intelligence can build citation maps, extract cited entities,
606
- search pack records, write provider-free research briefs, build cited source
607
- graphs, or prepare the full sidecar bundle with
702
+ search pack records, build cited source graphs, prepare the full sidecar
703
+ bundle, and write eval-grade rights/provenance artifacts with
608
704
  `docpull pack citations`, `docpull pack entities`, `docpull pack search`,
609
- `docpull pack brief`, `docpull graph build`, `docpull graph query`, and
610
- `docpull pack prepare`.
611
- - Local-first expansion commands add policy files, discovery packs, refresh
612
- reports, audits, cited answers, exports, a localhost pack server, explicit
613
- rendering, authenticated-source checks, and cron-friendly monitors:
614
- `docpull policy`, `docpull discover`, `docpull refresh`,
615
- `docpull pack audit`, `docpull answer-pack`, `docpull export`,
616
- `docpull serve`, `docpull share`, `docpull render`, `docpull auth check`, and
617
- `docpull monitor`.
705
+ `docpull pack brief`, `docpull graph build`, `docpull graph query`,
706
+ and `docpull pack prepare --eval-grade`.
707
+ - Release commands add policy files, refresh reports, audits, exports, a
708
+ localhost pack server, explicit rendering, authenticated-source checks, and
709
+ cron-friendly monitors:
710
+ `docpull policy`, `docpull refresh`,
711
+ `docpull parse`, `docpull openapi-pack`, `docpull feed-pack`,
712
+ `docpull paper-pack`, `docpull repo-pack`, `docpull package-pack`,
713
+ `docpull standards-pack`, `docpull dataset-pack`, `docpull transcript-pack`,
714
+ `docpull wiki-pack`,
715
+ `docpull pack validate`,
716
+ `docpull pack audit`, `docpull export`,
717
+ `docpull serve`, `docpull share`, `docpull render`, `docpull auth check`,
718
+ and `docpull monitor`.
618
719
  - `docpull export` writes local files for OpenAI vector JSONL, LangChain,
619
720
  LlamaIndex, DSPy, Sheets CSV/TSV, n8n workflow JSON, Vercel AI SDK JSON,
620
721
  CrewAI JSON, warehouse NDJSON, optional Parquet via `docpull[parquet]`, and
621
722
  Codex/Claude/Cursor agent references.
622
- - Optional provider workflows can use Parallel, Tavily, and Exa when configured.
623
- Tavily and Exa are available through `docpull providers ...` and first-class
624
- aliases such as `docpull tavily context-pack`, `docpull exa context-pack`,
625
- `docpull exa extract-pack`, and `docpull tavily map-pack`. Use
626
- `docpull providers capabilities` to see the shared baseline and provider-only
627
- extensions. For agent or CI logs, use
628
- `docpull providers auth --json --require-ready --redact-paths` for offline
629
- local readiness, then `docpull providers probe --json --require-verified
630
- --redact-paths` when explicit live key validation is intended. Successful
631
- provider context-pack runs are post-processed into the same local pack
632
- intelligence artifacts.
633
- See [CLI Recipes](docs/examples/README.md#parallel-context-pack).
634
- - SEC filing evidence packs use rule profiles such as
635
- [vendor-dependency-rules.yml](docs/examples/vendor-dependency-rules.yml).
636
-
637
723
  ## Security Defaults
638
724
 
639
725
  - HTTPS-only fetching with robots.txt compliance.
@@ -659,11 +745,10 @@ docpull URL --preview-urls
659
745
  ## Documentation
660
746
 
661
747
  - [CLI Recipes](docs/examples/README.md) - common commands and advanced workflows.
662
- - [Scraping Boundary](docs/scraping-boundary.md) - what docpull does and does not fetch.
748
+ - [Web Source Boundary](docs/scraping-boundary.md) - what docpull does and does not fetch.
663
749
  - [Alternatives](docs/alternatives.md) - when to use browser automation or hosted extraction.
664
750
  - [Corpus Manifest](docs/corpus-manifest.md) - stable IDs, hashes, and source maps.
665
751
  - [Surface Contract](docs/surface-contract.md) - how the CLI, Python SDK/API, and MCP surfaces align.
666
- - [Parallel Integration](docs/parallel.md) - live-source context pack workflows.
667
752
  - [Changelog](docs/CHANGELOG.md) - release history.
668
753
 
669
754
  ## Links