primr 1.20.1__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 (264) hide show
  1. primr-1.20.1/.env.example +57 -0
  2. primr-1.20.1/LICENSE +21 -0
  3. primr-1.20.1/MANIFEST.in +40 -0
  4. primr-1.20.1/PKG-INFO +378 -0
  5. primr-1.20.1/README.md +296 -0
  6. primr-1.20.1/ROADMAP.md +1200 -0
  7. primr-1.20.1/docs/API.md +2128 -0
  8. primr-1.20.1/docs/API_KEYS.md +220 -0
  9. primr-1.20.1/docs/ARCHITECTURE.md +1100 -0
  10. primr-1.20.1/docs/AZURE_QUICKSTART.md +217 -0
  11. primr-1.20.1/docs/BATCH.md +35 -0
  12. primr-1.20.1/docs/CHANGELOG.md +364 -0
  13. primr-1.20.1/docs/CLOUD_DEPLOYMENT.md +389 -0
  14. primr-1.20.1/docs/CONCURRENCY.md +287 -0
  15. primr-1.20.1/docs/CONFIG.md +303 -0
  16. primr-1.20.1/docs/CONTRIBUTING.md +102 -0
  17. primr-1.20.1/docs/COPILOT_COWORK_GUIDE.md +141 -0
  18. primr-1.20.1/docs/COPILOT_STUDIO_GUIDE.md +188 -0
  19. primr-1.20.1/docs/EVAL.md +73 -0
  20. primr-1.20.1/docs/FOUNDRY_AGENT_GUIDE.md +167 -0
  21. primr-1.20.1/docs/IMPROVE.md +26 -0
  22. primr-1.20.1/docs/INDEX.md +42 -0
  23. primr-1.20.1/docs/INTERNALS.md +742 -0
  24. primr-1.20.1/docs/MIGRATION.md +149 -0
  25. primr-1.20.1/docs/OPENCLAW.md +212 -0
  26. primr-1.20.1/docs/RECOVERY.md +23 -0
  27. primr-1.20.1/docs/SECURITY.md +71 -0
  28. primr-1.20.1/docs/SECURITY_OPS.md +632 -0
  29. primr-1.20.1/docs/STATE_MACHINES.md +298 -0
  30. primr-1.20.1/docs/STRATEGY_PORTFOLIO.md +255 -0
  31. primr-1.20.1/docs/images/primr-demo.png +0 -0
  32. primr-1.20.1/mypy.ini +228 -0
  33. primr-1.20.1/pyproject.toml +199 -0
  34. primr-1.20.1/requirements.txt +38 -0
  35. primr-1.20.1/setup.cfg +4 -0
  36. primr-1.20.1/src/primr/__init__.py +48 -0
  37. primr-1.20.1/src/primr/__main__.py +9 -0
  38. primr-1.20.1/src/primr/a2a/__init__.py +39 -0
  39. primr-1.20.1/src/primr/a2a/agent_card.py +179 -0
  40. primr-1.20.1/src/primr/a2a/cli.py +118 -0
  41. primr-1.20.1/src/primr/a2a/client.py +242 -0
  42. primr-1.20.1/src/primr/a2a/executor.py +486 -0
  43. primr-1.20.1/src/primr/a2a/hooks.py +200 -0
  44. primr-1.20.1/src/primr/a2a/server.py +119 -0
  45. primr-1.20.1/src/primr/a2a/task_store.py +160 -0
  46. primr-1.20.1/src/primr/a2a/types.py +55 -0
  47. primr-1.20.1/src/primr/agentic/__init__.py +144 -0
  48. primr-1.20.1/src/primr/agentic/errors.py +270 -0
  49. primr-1.20.1/src/primr/agentic/hooks.py +1097 -0
  50. primr-1.20.1/src/primr/agentic/integration.py +572 -0
  51. primr-1.20.1/src/primr/agentic/memory.py +601 -0
  52. primr-1.20.1/src/primr/agentic/models.py +337 -0
  53. primr-1.20.1/src/primr/agentic/orchestrator.py +870 -0
  54. primr-1.20.1/src/primr/agentic/roadmap_api.py +457 -0
  55. primr-1.20.1/src/primr/agentic/subagents/__init__.py +78 -0
  56. primr-1.20.1/src/primr/agentic/subagents/analyst.py +487 -0
  57. primr-1.20.1/src/primr/agentic/subagents/base.py +335 -0
  58. primr-1.20.1/src/primr/agentic/subagents/qa.py +497 -0
  59. primr-1.20.1/src/primr/agentic/subagents/scraper.py +287 -0
  60. primr-1.20.1/src/primr/agentic/subagents/verifier.py +494 -0
  61. primr-1.20.1/src/primr/agentic/subagents/writer.py +329 -0
  62. primr-1.20.1/src/primr/ai/__init__.py +103 -0
  63. primr-1.20.1/src/primr/ai/accordion_test.py +808 -0
  64. primr-1.20.1/src/primr/ai/ai_strategy.py +508 -0
  65. primr-1.20.1/src/primr/ai/async_client.py +467 -0
  66. primr-1.20.1/src/primr/ai/client.py +669 -0
  67. primr-1.20.1/src/primr/ai/competitive.py +672 -0
  68. primr-1.20.1/src/primr/ai/deep_research.py +4210 -0
  69. primr-1.20.1/src/primr/ai/deep_research_execution.py +77 -0
  70. primr-1.20.1/src/primr/ai/deep_research_parsing.py +138 -0
  71. primr-1.20.1/src/primr/ai/deep_research_polling.py +38 -0
  72. primr-1.20.1/src/primr/ai/error_policy.py +51 -0
  73. primr-1.20.1/src/primr/ai/grading_agent.py +85 -0
  74. primr-1.20.1/src/primr/ai/grok_client.py +573 -0
  75. primr-1.20.1/src/primr/ai/insight_engine.py +679 -0
  76. primr-1.20.1/src/primr/ai/insights.py +607 -0
  77. primr-1.20.1/src/primr/ai/llm.py +272 -0
  78. primr-1.20.1/src/primr/ai/openai_compatible_client.py +140 -0
  79. primr-1.20.1/src/primr/ai/preflight.py +489 -0
  80. primr-1.20.1/src/primr/ai/quality_grader.py +373 -0
  81. primr-1.20.1/src/primr/ai/report_aggregator.py +364 -0
  82. primr-1.20.1/src/primr/ai/report_architect.py +397 -0
  83. primr-1.20.1/src/primr/ai/research_executor.py +542 -0
  84. primr-1.20.1/src/primr/ai/result_normalizer.py +286 -0
  85. primr-1.20.1/src/primr/ai/summarize.py +359 -0
  86. primr-1.20.1/src/primr/api/__init__.py +96 -0
  87. primr-1.20.1/src/primr/api/auth.py +459 -0
  88. primr-1.20.1/src/primr/api/metrics.py +465 -0
  89. primr-1.20.1/src/primr/api/rate_limit.py +240 -0
  90. primr-1.20.1/src/primr/api/service.py +550 -0
  91. primr-1.20.1/src/primr/api/tenancy.py +829 -0
  92. primr-1.20.1/src/primr/config/__init__.py +74 -0
  93. primr-1.20.1/src/primr/config/config.py +260 -0
  94. primr-1.20.1/src/primr/config/local_eval_models.py +45 -0
  95. primr-1.20.1/src/primr/config/models.py +663 -0
  96. primr-1.20.1/src/primr/config/prompts.py +166 -0
  97. primr-1.20.1/src/primr/config/sections_config.py +26 -0
  98. primr-1.20.1/src/primr/config/settings.py +595 -0
  99. primr-1.20.1/src/primr/core/__init__.py +50 -0
  100. primr-1.20.1/src/primr/core/ai_strategy.py +659 -0
  101. primr-1.20.1/src/primr/core/ai_strategy_runtime.py +330 -0
  102. primr-1.20.1/src/primr/core/cli.py +4143 -0
  103. primr-1.20.1/src/primr/core/container.py +287 -0
  104. primr-1.20.1/src/primr/core/deep_research_runner.py +615 -0
  105. primr-1.20.1/src/primr/core/local_stage_eval.py +385 -0
  106. primr-1.20.1/src/primr/core/model_eval.py +1410 -0
  107. primr-1.20.1/src/primr/core/platform_mapper.py +49 -0
  108. primr-1.20.1/src/primr/core/recon_context.py +298 -0
  109. primr-1.20.1/src/primr/core/report_models.py +290 -0
  110. primr-1.20.1/src/primr/core/research_agent.py +8675 -0
  111. primr-1.20.1/src/primr/core/research_orchestrator.py +1087 -0
  112. primr-1.20.1/src/primr/core/strategy_generation.py +285 -0
  113. primr-1.20.1/src/primr/core/structured_research.py +633 -0
  114. primr-1.20.1/src/primr/core/vendor_research.py +517 -0
  115. primr-1.20.1/src/primr/core/workspace.py +411 -0
  116. primr-1.20.1/src/primr/data/__init__.py +270 -0
  117. primr-1.20.1/src/primr/data/adaptive_scraper.py +496 -0
  118. primr-1.20.1/src/primr/data/cache.py +516 -0
  119. primr-1.20.1/src/primr/data/content_extractor.py +516 -0
  120. primr-1.20.1/src/primr/data/fallback_sources.py +813 -0
  121. primr-1.20.1/src/primr/data/hiring_signals.py +1261 -0
  122. primr-1.20.1/src/primr/data/http_client.py +471 -0
  123. primr-1.20.1/src/primr/data/insights_extractor.py +112 -0
  124. primr-1.20.1/src/primr/data/knowledge_graph.py +693 -0
  125. primr-1.20.1/src/primr/data/link_scorer.py +500 -0
  126. primr-1.20.1/src/primr/data/monitoring.py +713 -0
  127. primr-1.20.1/src/primr/data/pagination.py +573 -0
  128. primr-1.20.1/src/primr/data/parallel_scraper.py +449 -0
  129. primr-1.20.1/src/primr/data/scrape.py +1775 -0
  130. primr-1.20.1/src/primr/data/scraping/__init__.py +330 -0
  131. primr-1.20.1/src/primr/data/scraping/browsers.py +2012 -0
  132. primr-1.20.1/src/primr/data/scraping/cache.py +370 -0
  133. primr-1.20.1/src/primr/data/scraping/compat.py +0 -0
  134. primr-1.20.1/src/primr/data/scraping/config.py +253 -0
  135. primr-1.20.1/src/primr/data/scraping/content.py +749 -0
  136. primr-1.20.1/src/primr/data/scraping/detection.py +366 -0
  137. primr-1.20.1/src/primr/data/scraping/discovery.py +998 -0
  138. primr-1.20.1/src/primr/data/scraping/headed_budget.py +62 -0
  139. primr-1.20.1/src/primr/data/scraping/http_clients.py +514 -0
  140. primr-1.20.1/src/primr/data/scraping/models.py +180 -0
  141. primr-1.20.1/src/primr/data/scraping/net.py +257 -0
  142. primr-1.20.1/src/primr/data/scraping/orchestrator.py +1046 -0
  143. primr-1.20.1/src/primr/data/scraping/org_profile.py +179 -0
  144. primr-1.20.1/src/primr/data/scraping/page_access.py +345 -0
  145. primr-1.20.1/src/primr/data/scraping/profiles.py +393 -0
  146. primr-1.20.1/src/primr/data/scraping/rate_limit_state.py +204 -0
  147. primr-1.20.1/src/primr/data/scraping/rate_limiter.py +193 -0
  148. primr-1.20.1/src/primr/data/scraping/stealth_browser.py +676 -0
  149. primr-1.20.1/src/primr/data/scraping/structured_content.py +1067 -0
  150. primr-1.20.1/src/primr/data/scraping/tier_registry.py +171 -0
  151. primr-1.20.1/src/primr/data/scraping/trace.py +230 -0
  152. primr-1.20.1/src/primr/data/scraping/validation.py +320 -0
  153. primr-1.20.1/src/primr/data/scraping/vertical_slice.py +223 -0
  154. primr-1.20.1/src/primr/data/scraping/wayback.py +256 -0
  155. primr-1.20.1/src/primr/data/search_utils.py +520 -0
  156. primr-1.20.1/src/primr/data/sentiment.py +707 -0
  157. primr-1.20.1/src/primr/data/validator.py +635 -0
  158. primr-1.20.1/src/primr/mcp_server/__init__.py +42 -0
  159. primr-1.20.1/src/primr/mcp_server/agentic_resources.py +283 -0
  160. primr-1.20.1/src/primr/mcp_server/agentic_tools.py +515 -0
  161. primr-1.20.1/src/primr/mcp_server/auth.py +596 -0
  162. primr-1.20.1/src/primr/mcp_server/cli.py +150 -0
  163. primr-1.20.1/src/primr/mcp_server/cloud_detect.py +30 -0
  164. primr-1.20.1/src/primr/mcp_server/job_store.py +549 -0
  165. primr-1.20.1/src/primr/mcp_server/logging_config.py +141 -0
  166. primr-1.20.1/src/primr/mcp_server/pipeline_runner.py +608 -0
  167. primr-1.20.1/src/primr/mcp_server/prompts.py +255 -0
  168. primr-1.20.1/src/primr/mcp_server/resources.py +872 -0
  169. primr-1.20.1/src/primr/mcp_server/security.py +572 -0
  170. primr-1.20.1/src/primr/mcp_server/server.py +363 -0
  171. primr-1.20.1/src/primr/mcp_server/spike.py +156 -0
  172. primr-1.20.1/src/primr/mcp_server/tools.py +1607 -0
  173. primr-1.20.1/src/primr/mcp_server/types.py +251 -0
  174. primr-1.20.1/src/primr/mcp_server/versioning.py +451 -0
  175. primr-1.20.1/src/primr/output/__init__.py +134 -0
  176. primr-1.20.1/src/primr/output/chapter_config.py +144 -0
  177. primr-1.20.1/src/primr/output/citation_processor.py +312 -0
  178. primr-1.20.1/src/primr/output/content_pattern_detector.py +220 -0
  179. primr-1.20.1/src/primr/output/document_builder.py +643 -0
  180. primr-1.20.1/src/primr/output/executive_summary.py +883 -0
  181. primr-1.20.1/src/primr/output/executive_summary_generator.py +299 -0
  182. primr-1.20.1/src/primr/output/final_artifact.py +179 -0
  183. primr-1.20.1/src/primr/output/markdown_converter.py +462 -0
  184. primr-1.20.1/src/primr/output/markdown_parser.py +432 -0
  185. primr-1.20.1/src/primr/output/models.py +150 -0
  186. primr-1.20.1/src/primr/output/output_utils.py +516 -0
  187. primr-1.20.1/src/primr/output/polish_elements.py +387 -0
  188. primr-1.20.1/src/primr/output/qa_report_generator.py +240 -0
  189. primr-1.20.1/src/primr/output/report_assembler.py +382 -0
  190. primr-1.20.1/src/primr/output/section_writer.py +300 -0
  191. primr-1.20.1/src/primr/output/style_engine.py +409 -0
  192. primr-1.20.1/src/primr/output/table_builder.py +280 -0
  193. primr-1.20.1/src/primr/output/templates.py +676 -0
  194. primr-1.20.1/src/primr/pipeline/__init__.py +71 -0
  195. primr-1.20.1/src/primr/pipeline/errors.py +126 -0
  196. primr-1.20.1/src/primr/pipeline/executor.py +322 -0
  197. primr-1.20.1/src/primr/pipeline/integration.py +207 -0
  198. primr-1.20.1/src/primr/pipeline/model_breaker.py +204 -0
  199. primr-1.20.1/src/primr/pipeline/recovery.py +251 -0
  200. primr-1.20.1/src/primr/pipeline/stages.py +74 -0
  201. primr-1.20.1/src/primr/primr_cli.py +23 -0
  202. primr-1.20.1/src/primr/prompts/__init__.py +87 -0
  203. primr-1.20.1/src/primr/prompts/composer.py +672 -0
  204. primr-1.20.1/src/primr/prompts/exceptions.py +130 -0
  205. primr-1.20.1/src/primr/prompts/loader.py +227 -0
  206. primr-1.20.1/src/primr/prompts/migration.py +416 -0
  207. primr-1.20.1/src/primr/prompts/registry.py +250 -0
  208. primr-1.20.1/src/primr/prompts/schema.py +257 -0
  209. primr-1.20.1/src/primr/prompts/shared_loader.py +181 -0
  210. primr-1.20.1/src/primr/prompts/validation.py +248 -0
  211. primr-1.20.1/src/primr/py.typed +0 -0
  212. primr-1.20.1/src/primr/qa/__init__.py +24 -0
  213. primr-1.20.1/src/primr/qa/analyzer.py +441 -0
  214. primr-1.20.1/src/primr/qa/command.py +305 -0
  215. primr-1.20.1/src/primr/qa/config.py +311 -0
  216. primr-1.20.1/src/primr/qa/error_handler.py +252 -0
  217. primr-1.20.1/src/primr/qa/integration.py +401 -0
  218. primr-1.20.1/src/primr/qa/issue_classifier.py +251 -0
  219. primr-1.20.1/src/primr/qa/json_parser.py +326 -0
  220. primr-1.20.1/src/primr/qa/models.py +147 -0
  221. primr-1.20.1/src/primr/qa/monitor.py +350 -0
  222. primr-1.20.1/src/primr/qa/report_analyzer.py +530 -0
  223. primr-1.20.1/src/primr/qa/report_loader.py +375 -0
  224. primr-1.20.1/src/primr/qa/simple_analyzer.py +492 -0
  225. primr-1.20.1/src/primr/types.py +475 -0
  226. primr-1.20.1/src/primr/utils/__init__.py +268 -0
  227. primr-1.20.1/src/primr/utils/async_utils.py +487 -0
  228. primr-1.20.1/src/primr/utils/banner.py +419 -0
  229. primr-1.20.1/src/primr/utils/benchmarks.py +652 -0
  230. primr-1.20.1/src/primr/utils/chat_logger.py +124 -0
  231. primr-1.20.1/src/primr/utils/circuit_breaker.py +712 -0
  232. primr-1.20.1/src/primr/utils/config_validation.py +683 -0
  233. primr-1.20.1/src/primr/utils/console.py +649 -0
  234. primr-1.20.1/src/primr/utils/content_sanitizer.py +499 -0
  235. primr-1.20.1/src/primr/utils/cost_estimator.py +578 -0
  236. primr-1.20.1/src/primr/utils/defensive.py +428 -0
  237. primr-1.20.1/src/primr/utils/errors/__init__.py +111 -0
  238. primr-1.20.1/src/primr/utils/errors/base.py +174 -0
  239. primr-1.20.1/src/primr/utils/errors/decorators.py +224 -0
  240. primr-1.20.1/src/primr/utils/errors/formatting.py +87 -0
  241. primr-1.20.1/src/primr/utils/errors/retry.py +176 -0
  242. primr-1.20.1/src/primr/utils/errors/typed.py +413 -0
  243. primr-1.20.1/src/primr/utils/files.py +391 -0
  244. primr-1.20.1/src/primr/utils/formatting.py +360 -0
  245. primr-1.20.1/src/primr/utils/logging_config.py +230 -0
  246. primr-1.20.1/src/primr/utils/memory_profiler.py +424 -0
  247. primr-1.20.1/src/primr/utils/observability.py +726 -0
  248. primr-1.20.1/src/primr/utils/resources.py +728 -0
  249. primr-1.20.1/src/primr/utils/retrieve_research.py +82 -0
  250. primr-1.20.1/src/primr/utils/retry.py +474 -0
  251. primr-1.20.1/src/primr/utils/security.py +806 -0
  252. primr-1.20.1/src/primr/utils/state_machine.py +533 -0
  253. primr-1.20.1/src/primr/utils/telemetry.py +873 -0
  254. primr-1.20.1/src/primr/utils/terminal.py +234 -0
  255. primr-1.20.1/src/primr/utils/theme.py +217 -0
  256. primr-1.20.1/src/primr/utils/type_guards.py +880 -0
  257. primr-1.20.1/src/primr/utils/usage_tracker.py +452 -0
  258. primr-1.20.1/src/primr/utils/validators.py +771 -0
  259. primr-1.20.1/src/primr.egg-info/PKG-INFO +378 -0
  260. primr-1.20.1/src/primr.egg-info/SOURCES.txt +262 -0
  261. primr-1.20.1/src/primr.egg-info/dependency_links.txt +1 -0
  262. primr-1.20.1/src/primr.egg-info/entry_points.txt +4 -0
  263. primr-1.20.1/src/primr.egg-info/requires.txt +58 -0
  264. primr-1.20.1/src/primr.egg-info/top_level.txt +1 -0
@@ -0,0 +1,57 @@
1
+ # Primr Environment Configuration
2
+ # Copy this file to .env and fill in your API keys
3
+
4
+ # Required: Google Gemini API key
5
+ # Get yours at: https://aistudio.google.com/apikey
6
+ GEMINI_API_KEY=your_gemini_api_key_here
7
+
8
+ # =============================================================================
9
+ # Search Provider (optional — DuckDuckGo is used by default, no key needed)
10
+ # =============================================================================
11
+
12
+ # SEARCH_PROVIDER controls which search engine Primr uses:
13
+ # "auto" (default) = DuckDuckGo (no API key required)
14
+ # "ddg" = DuckDuckGo explicitly
15
+ # "google" = Google Custom Search (requires keys below)
16
+ # SEARCH_PROVIDER=auto
17
+
18
+ # Optional: Google Custom Search API (only needed if SEARCH_PROVIDER=google)
19
+ # SEARCH_API_KEY=your_search_api_key_here
20
+ # SEARCH_ENGINE_ID=your_search_engine_id_here
21
+
22
+ # Optional: xAI API key for --fast mode (Grok 4.1)
23
+ # Get yours at: https://console.x.ai/
24
+ # XAI_API_KEY=xai-your_xai_api_key_here
25
+
26
+ # Optional: Override default models (defaults: gemini-3-flash-preview / gemini-3.1-pro-preview)
27
+ # AI_FAST_MODEL=gemini-3-flash-preview
28
+ # AI_REASONING_MODEL=gemini-3.1-pro-preview
29
+ # To revert to Gemini 3.0 Pro (flat $2/$12 pricing):
30
+ # AI_REASONING_MODEL=gemini-3-pro-preview
31
+
32
+ # Optional: Enable verbose output
33
+ # VERBOSE=true
34
+
35
+ # =============================================================================
36
+ # MCP Server Authentication (HTTP mode only)
37
+ # =============================================================================
38
+
39
+ # Static admin tokens (comma-separated) - for simple deployments
40
+ # MCP_ADMIN_TOKENS=token1,token2
41
+
42
+ # JWT authentication - for production deployments
43
+ # Secret key for JWT signature verification (minimum 32 characters recommended)
44
+ # MCP_JWT_SECRET=your-secret-key-minimum-32-characters
45
+
46
+ # Optional: Validate JWT issuer claim
47
+ # MCP_JWT_ISSUER=your-issuer
48
+
49
+ # Optional: Validate JWT audience claim
50
+ # MCP_JWT_AUDIENCE=your-audience
51
+
52
+ # =============================================================================
53
+ # REST API Configuration
54
+ # =============================================================================
55
+
56
+ # CORS allowed origins (comma-separated) - defaults to localhost only
57
+ # PRIMR_CORS_ORIGINS=https://your-frontend.com,https://admin.your-domain.com
primr-1.20.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025-2026 Nick Seal
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.
@@ -0,0 +1,40 @@
1
+ # Include documentation
2
+ include README.md
3
+ include docs/CHANGELOG.md
4
+ include ROADMAP.md
5
+ include LICENSE
6
+
7
+ # Include configuration files
8
+ include pyproject.toml
9
+ include requirements.txt
10
+ include pytest.ini
11
+ include mypy.ini
12
+ include .env.example
13
+
14
+ # Include documentation directory
15
+ recursive-include docs *.md
16
+ recursive-include docs/examples *.docx *.md
17
+ recursive-include docs/images *.png *.jpg *.gif
18
+
19
+ # Include type stubs
20
+ include src/primr/py.typed
21
+
22
+ # Exclude development and test files
23
+ exclude setup_env.py
24
+ exclude primr.cmd
25
+ recursive-exclude tests *
26
+ recursive-exclude .pytest_cache *
27
+ recursive-exclude .mypy_cache *
28
+ recursive-exclude .ruff_cache *
29
+ recursive-exclude .hypothesis *
30
+ recursive-exclude logs *
31
+ recursive-exclude output *
32
+ recursive-exclude working *
33
+ recursive-exclude archive *
34
+
35
+ # Exclude build artifacts
36
+ global-exclude *.pyc
37
+ global-exclude *.pyo
38
+ global-exclude __pycache__
39
+ global-exclude .DS_Store
40
+ global-exclude *.egg-info
primr-1.20.1/PKG-INFO ADDED
@@ -0,0 +1,378 @@
1
+ Metadata-Version: 2.4
2
+ Name: primr
3
+ Version: 1.20.1
4
+ Summary: Turn any company or organization URL into a strategic intelligence brief. Adaptive scraping + AI-powered research and synthesis.
5
+ Author-email: Nick Seal <nick@pueo.io>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/blisspixel/primr
8
+ Project-URL: Documentation, https://github.com/blisspixel/primr#readme
9
+ Project-URL: Repository, https://github.com/blisspixel/primr
10
+ Project-URL: Bug Tracker, https://github.com/blisspixel/primr/issues
11
+ Keywords: ai,research,company,intelligence,gemini,grok,report,analysis,scraping
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: End Users/Desktop
16
+ Classifier: Intended Audience :: Information Technology
17
+ Classifier: License :: OSI Approved :: MIT License
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Topic :: Office/Business
24
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
25
+ Classifier: Topic :: Text Processing :: Markup :: Markdown
26
+ Requires-Python: >=3.11
27
+ Description-Content-Type: text/markdown
28
+ License-File: LICENSE
29
+ Requires-Dist: google-genai>=1.55.0
30
+ Requires-Dist: requests
31
+ Requires-Dist: beautifulsoup4
32
+ Requires-Dist: fpdf
33
+ Requires-Dist: python-docx
34
+ Requires-Dist: pymupdf
35
+ Requires-Dist: pandas
36
+ Requires-Dist: openpyxl
37
+ Requires-Dist: pytesseract
38
+ Requires-Dist: markdown
39
+ Requires-Dist: colorama
40
+ Requires-Dist: rich>=13.0.0
41
+ Requires-Dist: python-dotenv
42
+ Requires-Dist: httpx[http2]
43
+ Requires-Dist: playwright
44
+ Requires-Dist: patchright
45
+ Requires-Dist: docx2pdf
46
+ Requires-Dist: pyyaml
47
+ Requires-Dist: curl_cffi
48
+ Requires-Dist: DrissionPage
49
+ Requires-Dist: ddgs>=9.0.0
50
+ Requires-Dist: mcp>=1.0.0
51
+ Requires-Dist: defusedxml
52
+ Requires-Dist: typer>=0.9.0
53
+ Requires-Dist: starlette>=0.27.0
54
+ Requires-Dist: uvicorn>=0.20.0
55
+ Requires-Dist: recon-tool>=1.3.1
56
+ Provides-Extra: dev
57
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
58
+ Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
59
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
60
+ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
61
+ Requires-Dist: hypothesis>=6.0.0; extra == "dev"
62
+ Requires-Dist: mypy>=1.0.0; extra == "dev"
63
+ Requires-Dist: ruff<0.16.0,>=0.15.5; extra == "dev"
64
+ Provides-Extra: api
65
+ Requires-Dist: fastapi>=0.100.0; extra == "api"
66
+ Requires-Dist: pydantic>=2.0.0; extra == "api"
67
+ Requires-Dist: uvicorn>=0.20.0; extra == "api"
68
+ Provides-Extra: fast
69
+ Requires-Dist: openai>=1.0.0; extra == "fast"
70
+ Provides-Extra: a2a
71
+ Requires-Dist: a2a-sdk[http-server]<0.4.0,>=0.3.20; extra == "a2a"
72
+ Provides-Extra: security
73
+ Requires-Dist: bandit>=1.7.0; extra == "security"
74
+ Provides-Extra: azure
75
+ Requires-Dist: azure-cosmos>=4.5.0; extra == "azure"
76
+ Requires-Dist: azure-storage-blob>=12.19.0; extra == "azure"
77
+ Requires-Dist: azure-servicebus>=7.11.0; extra == "azure"
78
+ Requires-Dist: azure-identity>=1.15.0; extra == "azure"
79
+ Requires-Dist: azure-keyvault-secrets>=4.7.0; extra == "azure"
80
+ Requires-Dist: opencensus-ext-azure>=1.1.0; extra == "azure"
81
+ Dynamic: license-file
82
+
83
+ # Primr
84
+
85
+ [![CI](https://github.com/blisspixel/primr/actions/workflows/ci.yml/badge.svg)](https://github.com/blisspixel/primr/actions/workflows/ci.yml)
86
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
87
+ [![Python 3.11+](https://img.shields.io/badge/Python-3.11%2B-blue.svg)](https://www.python.org/downloads/)
88
+
89
+ **Turn any company or organization URL into deep strategic analysis that gets a consultant maximally up to speed.**
90
+
91
+ Primr extracts primary-source data from company and organization websites using adaptive, org-aware scraping that handles modern site architectures, then synthesizes external research into long-form strategic analysis using AI-powered research and synthesis (Grok 4.1 by default, or Gemini Deep Research via `--premium`).
92
+
93
+ Runs as a CLI, an MCP server, an OpenClaw integration, and a Claude Skill.
94
+
95
+ ```
96
+ primr "ExampleCo" https://example.co
97
+ ```
98
+
99
+ About 35-50 minutes later: a deep strategic analysis covering competitive positioning, technology stack, strategic initiatives, likely constraints, and consultant-grade hypotheses, with dense references consolidated at the end. ~$0.75 in API costs.
100
+
101
+ ## Why This Exists
102
+
103
+ Company research is tedious. You visit the website, click around, search the company, read articles, synthesize it all, write it up. That process easily takes 1-2 hours per company and the output is usually unstructured notes. Primr replaces that entire workflow with a single command.
104
+
105
+ ## What Makes It Different
106
+
107
+ - **DNS intelligence pre-flight**: Automatic domain reconnaissance detects cloud platforms, SaaS services, email security, and identity providers from DNS records — zero API keys, 2-3 seconds. Strategies are grounded in real tech stack data.
108
+ - **Hiring-signal gathering**: After the main scrape, Primr discovers open job postings (Greenhouse, Lever, Ashby, SmartRecruiters board APIs first; HTML careers-page fallback if every ATS misses), LLM-triages the most signal-rich roles, and extracts tech-stack frequency, strategic initiatives, culture cues, and notable absences. Job posts are often the most honest statement of what a company is actually building right now — they feed every downstream phase from gap analysis to final strategy. Skip with `PRIMR_SKIP_HIRING_SIGNALS=1`.
109
+ - **Adaptive scraping**: 8 retrieval methods from browser rendering to TLS fingerprinting to screenshot+vision extraction, with per-host optimization. Starts with full browser rendering (what works on 95%+ of modern sites) and falls back through increasingly specialized methods.
110
+ - **Org-aware site selection**: Link discovery and prioritization now adapt for commercial companies, government sites, nonprofits, education, and healthcare organizations instead of assuming every site looks like a SaaS company.
111
+ - **Fail-fast scrape quality gate**: Full/scrape modes now abort when site extraction is too thin, while still preserving short structured pages like contact, leadership, and org-chart references when they carry useful signal (override with `--skip-scrape-validation`).
112
+ - **Autonomous external research**: Gemini Deep Research for comprehensive analysis, Grok 4.1 for fast turnaround — both plan queries, follow leads, cross-validate sources, and synthesize findings.
113
+ - **Cost controls built in**: `--dry-run` estimates (including recovery table and stage classifications), usage tracking, and governance hooks for budget limits.
114
+ - **Agent-native interfaces**: CLI, MCP server, OpenClaw integration, and Claude Skills, all first-class.
115
+
116
+ ## Artifact Model
117
+
118
+ Primr treats **research artifacts** and **shipping artifacts** as different classes of output. Intermediate research steps such as scrape summaries, gap-analysis notes, source inventories, contradiction findings, and section briefs optimize for consistency, provenance, and parseability. Their formatting matters far less than whether they are complete and structured enough to feed later stages reliably.
119
+
120
+ Final reports and strategy documents are different. Those artifacts must ship cleanly as Markdown, TXT, DOCX, and eventually PDF, so Primr treats them as a stricter output contract with deterministic cleanup, citation normalization, validation gates, and renderer hardening.
121
+
122
+ What is already in place:
123
+ - Final-document canonicalization before shipping so report/strategy artifacts are normalized into a stable shape before MD/TXT/DOCX rendering
124
+ - Typed generated-section normalization at the section-writing seam, including validation-line cleanup, embedded reference stripping, and citation extraction
125
+ - Mixed-format parsing resilience so section batches can recover cleanly even if the model blends XML-style section envelopes with legacy `##` headings
126
+ - Cleaner artifact validation for rendered DOCX outputs, including reduced false positives from literal `#` content inside tables
127
+
128
+ Near-term work remains focused on pushing more structure upstream into the long-form writing steps, reducing arbitrary markdown repair before shipping, and strengthening artifact gates against real-world failed artifacts.
129
+
130
+ ## Modes
131
+
132
+ | Mode | What it does | Time | Cost |
133
+ |------|--------------|------|------|
134
+ | Default | Grok 4.20 hybrid + AI Strategy (recon auto-detects platform) | ~35-50 min | ~$0.75 |
135
+ | `--platform ms` | Microsoft Azure + NVIDIA private cloud strategy | ~45-60 min | ~$0.80 |
136
+ | Default + multi-platform | Add `--platform aws azure` | ~45-60 min | ~$0.80 |
137
+ | Default + strategy type | Add `--strategy-type customer_experience` | ~35-50 min | ~$0.75 |
138
+ | `--grok-tier fast` | Grok 4.1 everywhere (cheaper, slightly lower quality) | ~30-45 min | ~$0.47 |
139
+ | `--grok-tier max` | Grok 4.20 everywhere (diminishing returns on writing) | ~35-50 min | ~$4.29 |
140
+ | `--premium` | Gemini + Deep Research + AI Strategy | 50-75 min | ~$5 |
141
+ | `--premium --platform ms` | Premium + Microsoft/NVIDIA | 75-120 min | $6-9 |
142
+ | `--premium --lite` | Pro model instead of DR for AI Strategy | 50-80 min | ~$4 |
143
+ | `--mode scrape` | Crawl site + extract insights only | 5-10 min | $0.10 |
144
+ | `--mode deep` | Gemini Deep Research on external sources only | 10-15 min | $2.50 |
145
+ | `primr recon` | DNS intelligence only (no API keys needed) | 2-3 sec | $0.00 |
146
+
147
+ The default `primr` command auto-detects: when `XAI_API_KEY` is set, it uses the Grok 4.20 hybrid pipeline (4.20 for reasoning-heavy stages, 4.1 for bulk writing) at ~$0.67/run. The standard pipeline includes research deepening, cross-validation, trust-polish, citation normalization, and constrained-evidence reasoning. Strategy types (`ai`, `customer_experience`, `modern_security_compliance`, `data_fabric_strategy`) are YAML-defined and auto-discovered — run `primr --list-strategies` for details. DDG searches are free. Use `--dry-run` for accurate cost estimates.
148
+
149
+ For model evaluation and quality comparison, see [Evaluation Guide](docs/EVAL.md).
150
+
151
+ ## Quick Start
152
+
153
+ ```bash
154
+ git clone https://github.com/blisspixel/primr.git
155
+ cd primr
156
+ py -3.13 setup_env.py # Windows
157
+ # or: python3.13 setup_env.py # macOS/Linux
158
+ # Add your API keys to .env (see docs/API_KEYS.md)
159
+ primr doctor # Verify everything works
160
+ primr "ExampleCo" https://example.co # Run your first research
161
+ ```
162
+
163
+ Requires Python 3.11+. On Windows, prefer `py -3.13` instead of bare `python` if your default interpreter is older. `setup_env.py` installs or upgrades the local editable package to the current repo version, installs dependencies, and creates `.env`. Set `XAI_API_KEY` for the standard Grok pipeline (recommended), or `GEMINI_API_KEY` for Gemini/premium mode. Web search uses DuckDuckGo (no key needed).
164
+
165
+ ### Platform Support
166
+
167
+ - Windows
168
+ - macOS
169
+ - Linux
170
+
171
+ ```bash
172
+ # Standard run (auto-detects platform from DNS)
173
+ primr "Company" https://company.com
174
+
175
+ # Microsoft Azure + NVIDIA private cloud strategy
176
+ primr "Company" https://company.com --platform ms
177
+
178
+ # Research modes
179
+ primr "Company" https://company.com --mode scrape # Site corpus only
180
+ primr "Company" https://company.com --mode deep # External research only
181
+ primr "Company" https://company.com --dry-run # Cost estimate first
182
+
183
+ # Multi-platform and strategy types
184
+ primr "Company" https://company.com --platform aws azure # Multi-platform AI strategy
185
+ primr "Company" https://company.com --strategy-type customer_experience # CX strategy
186
+ primr --list-strategies # See all strategy types
187
+
188
+ # Premium (Gemini + Deep Research)
189
+ primr "Company" https://company.com --premium # ~$5, maximum depth
190
+ primr "Company" https://company.com --premium --lite # Cheaper premium strategy
191
+
192
+ # DNS intelligence (standalone, no API keys needed)
193
+ primr recon acme.com # DNS intelligence lookup
194
+ primr recon acme.com --json # Structured JSON output
195
+ ```
196
+
197
+ For batch processing, see [Batch Guide](docs/BATCH.md). For crash recovery and resume, see [Recovery Guide](docs/RECOVERY.md). For post-generation quality improvement, see [Improve Guide](docs/IMPROVE.md).
198
+
199
+ ### What a run looks like
200
+
201
+ ```
202
+ Grok 4.20 hybrid · recon auto-detected Azure
203
+
204
+ ▸ PHASE 0/6 · Recon
205
+ ✓ 14 services, 8 insights, platform: azure (2s)
206
+
207
+ ▸ PHASE 1/6 · Data Collection
208
+ ✓ 251 links → 50 selected
209
+ ✓ 48/50 pages scraped (6m 10s)
210
+ ✓ 31 external sources (8m 22s)
211
+
212
+ ▸ PHASE 2/6 · Research Deepening
213
+ ✓ 8 gaps identified, 12 additional sources
214
+
215
+ ▸ PHASE 3/6 · Analysis
216
+ ✓ Structured workbook built
217
+
218
+ ▸ PHASE 4/6 · Report Writing
219
+ Part 1/5: 7 sections in parallel
220
+ Part 2/5: 3 sections in parallel
221
+ Part 4/5: 7 sections in parallel
222
+ ✓ 23 sections, 21,500 words
223
+
224
+ ▸ PHASE 5/6 · Cross-Validation
225
+ ✓ 3 contradictions resolved
226
+ Trust: PASS · cites 12/12 · appendix clean
227
+
228
+ ▸ PHASE 6/6 · AI Strategy (Azure)
229
+ ✓ Strategy generated
230
+
231
+ ✓ Complete in 38m
232
+ output/ExampleCo_Strategic_Overview_04-10-2026.docx
233
+
234
+ PASS | 23 chapters | 48 citations | ~$0.74
235
+ ```
236
+
237
+ ### What the output looks like
238
+
239
+ From the executive summary of a sample report:
240
+
241
+ > Northwind Haulage Corp is a mid-market logistics optimization vendor ($180-220M ARR, estimated) that sells route planning and fleet analytics software to regional shipping companies. The company occupies a defensible but narrowing niche: optimizing last-mile delivery for carriers still running legacy dispatch systems.
242
+ >
243
+ > **Key insights:**
244
+ >
245
+ > - Northwind's customer concentration is high. Cross-referencing case studies, press releases, and conference presentations, roughly 40% of referenced deployments involve just 3 carrier networks. Loss of any one would be material. *[Confidence: Inferred]*
246
+ > - The company has no disclosed AI strategy, but 4 of their last 7 engineering hires have ML/optimization backgrounds. Combined with a patent filing for "autonomous route replanning under disruption," this suggests an unannounced product line. *[Confidence: Inferred]*
247
+ > - Pricing has shifted from perpetual licenses to consumption-based billing (per-shipment), visible in public procurement portal RFP responses. *[Confidence: Reported]*
248
+
249
+ Reports include 23 structured sections, SWOT analysis, competitive landscape, discovery questions, and inline confidence levels on every non-obvious claim.
250
+
251
+ ## Under the Hood
252
+
253
+ Primr uses an 8-tier browser-first retrieval engine with sticky tier memory, circuit breakers, and cookie handoff. Models range from Grok 4.1 ($0.20/$0.50 per 1M tokens) to Gemini Deep Research (~$2.50/task). The agentic architecture includes hypothesis tracking, subagents for each pipeline stage, governance hooks, and persistent research memory.
254
+
255
+ For full architecture details, model pricing, and the retrieval tier breakdown, see [System Design](docs/ARCHITECTURE.md).
256
+
257
+ ## Configuration
258
+
259
+ ```bash
260
+ # Recommended - for default Grok 4.1 pipeline
261
+ XAI_API_KEY= # https://console.x.ai/
262
+
263
+ # Required for --premium mode or if XAI_API_KEY not set
264
+ GEMINI_API_KEY= # https://aistudio.google.com/apikey
265
+
266
+ # Web search uses DuckDuckGo by default - no key needed
267
+ ```
268
+
269
+ [Full config reference](docs/CONFIG.md) | [API key setup](docs/API_KEYS.md)
270
+
271
+ ## Agent Integration
272
+
273
+ Primr is built for the agentic era. Four ways to plug it in:
274
+ **MCP Server** - Claude Desktop, Cursor, and any MCP-compatible client:
275
+ ```bash
276
+ primr-mcp --stdio # stdio transport
277
+ primr-mcp --http --port 8000 # HTTP with JWT auth
278
+ ```
279
+
280
+ **A2A Protocol** - Agent-to-Agent communication with any A2A-compatible agent:
281
+ ```bash
282
+ pip install primr[a2a] # install optional A2A support
283
+ primr-a2a --no-auth # standalone A2A server on port 9000
284
+ primr-mcp --http --a2a # co-hosted with MCP server
285
+ curl localhost:9000/.well-known/agent.json # discover agent capabilities
286
+ ```
287
+
288
+ <details>
289
+ <summary><strong>OpenClaw</strong> - Packaged skills, governed workflows, and sandbox config</summary>
290
+
291
+ ```bash
292
+ # openclaw/openclaw.json wires Primr MCP into OpenClaw
293
+ # Skills: primr-research, primr-strategy, primr-qa
294
+ # Workflows: research-pipeline, strategy-pipeline
295
+ ```
296
+
297
+ The packaged workflows estimate cost, require approval, and propagate approved cost caps into spend calls.
298
+ See `docs/OPENCLAW.md` for setup and troubleshooting.
299
+ </details>
300
+
301
+ <details>
302
+ <summary><strong>Claude Skills</strong> - MCP-first skill packages</summary>
303
+
304
+ ```text
305
+ skills/
306
+ ├── company-research/SKILL.md
307
+ ├── hypothesis-tracking/SKILL.md
308
+ ├── qa-iteration/SKILL.md
309
+ └── scrape-strategy/SKILL.md
310
+ ```
311
+
312
+ These skills are thin intent routers over Primr MCP rather than separate product definitions. Generic MCP clients can also use `primr://agent/governance`, `primr://research/next-actions`, and the `governed_execution` prompt to follow the same estimate/approval/monitor pattern.
313
+ </details>
314
+
315
+ [MCP docs](docs/API.md) | [A2A protocol](https://github.com/a2aproject/a2a-python) | [OpenClaw config](openclaw/openclaw.json) | [OpenClaw guide](docs/OPENCLAW.md)
316
+
317
+ ## Cloud Deployment
318
+
319
+ Primr is CLI-first, local-first. Cloud deployment is optional for teams needing shared access or always-on availability.
320
+
321
+ | Tier | What it is | Idle cost |
322
+ |------|-----------|-----------|
323
+ | Solo (default) | CLI on your machine | $0 |
324
+ | Team | Azure Container Apps, scale-to-zero | < $5/month |
325
+ | Organization | Entra ID, budget tracking, observability, M365 Agent Store | < $15/month |
326
+
327
+ See the [Deployment Guide](docs/CLOUD_DEPLOYMENT.md) or [Azure Quickstart](docs/AZURE_QUICKSTART.md).
328
+
329
+ ## Development
330
+
331
+ ```bash
332
+ python -m pytest tests/ -x --tb=short # Run tests
333
+ ruff check . # Lint
334
+ mypy src/primr --ignore-missing-imports # Type check
335
+ ```
336
+
337
+ 5,700+ tests including property-based testing (Hypothesis), full ruff and mypy compliance, and OpenTelemetry tracing. CI runs lint, type check, and tests on every push.
338
+
339
+ ## Learn More
340
+
341
+ | Topic | Guide |
342
+ |-------|-------|
343
+ | Batch processing | [Batch Guide](docs/BATCH.md) |
344
+ | Model evaluation | [Evaluation Guide](docs/EVAL.md) |
345
+ | Crash recovery | [Recovery Guide](docs/RECOVERY.md) |
346
+ | Output improvement | [Improve Guide](docs/IMPROVE.md) |
347
+ | Configuration | [Full Config Reference](docs/CONFIG.md) |
348
+ | Architecture | [System Design](docs/ARCHITECTURE.md) |
349
+ | Cloud deployment | [Deployment Guide](docs/CLOUD_DEPLOYMENT.md) |
350
+ | Agent integration | [MCP & A2A API](docs/API.md) |
351
+ | API key setup | [API Keys](docs/API_KEYS.md) |
352
+ | Azure quickstart | [Azure Quickstart](docs/AZURE_QUICKSTART.md) |
353
+ | OpenClaw | [Setup & Troubleshooting](docs/OPENCLAW.md) |
354
+ | Security ops | [Security Operations](docs/SECURITY_OPS.md) |
355
+ | Contributing | [Contribution Guidelines](docs/CONTRIBUTING.md) |
356
+ | Vulnerability reporting | [Security](docs/SECURITY.md) |
357
+ | Roadmap | [What's Planned](ROADMAP.md) |
358
+
359
+ ## About This Project
360
+
361
+ Primr is a nights-and-weekends project by a solo developer. The time-to-insight ratio for company research was terrible, and most of the work was mechanical. That's exactly what AI should be doing. So I built the tool I wanted.
362
+
363
+ It's not backed by a company or a team. It's an independent project built for personal use.
364
+
365
+ ## Disclaimer
366
+
367
+ Primr is a research tool. You are responsible for:
368
+
369
+ - **Web content**: Primr retrieves publicly available web content, similar to a browser or search engine crawler. It does not bypass authentication, access paywalled content, or exploit vulnerabilities. However, some websites restrict automated access in their terms of service - it is your responsibility to check before running Primr against any site.
370
+ - **Accuracy**: AI-generated content may contain errors, hallucinations, or outdated information. Verify findings before acting on them.
371
+ - **Costs**: API calls to AI services (Gemini, Grok) incur real charges. Use `--dry-run` to estimate costs before running.
372
+ - **Use case**: This tool is intended for legitimate research purposes. Do not use it to violate any website's terms of service or any applicable law.
373
+
374
+ This software is provided as-is by a solo developer. The author is not liable for how you use this software, the accuracy of its outputs, or any consequences of its use.
375
+
376
+ ## License
377
+
378
+ MIT