runport 0.1.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 (483) hide show
  1. runport-0.1.0/.dockerignore +23 -0
  2. runport-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +28 -0
  3. runport-0.1.0/.github/ISSUE_TEMPLATE/connector_request.md +27 -0
  4. runport-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  5. runport-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  6. runport-0.1.0/.github/dependabot.yml +19 -0
  7. runport-0.1.0/.github/workflows/ci.yml +164 -0
  8. runport-0.1.0/.github/workflows/pages.yml +56 -0
  9. runport-0.1.0/.github/workflows/release.yml +165 -0
  10. runport-0.1.0/.gitignore +81 -0
  11. runport-0.1.0/.gitleaksignore +9 -0
  12. runport-0.1.0/.pre-commit-config.yaml +27 -0
  13. runport-0.1.0/AGENTS.md +114 -0
  14. runport-0.1.0/CHANGELOG.md +20 -0
  15. runport-0.1.0/CODE_OF_CONDUCT.md +126 -0
  16. runport-0.1.0/CONTRIBUTING.md +74 -0
  17. runport-0.1.0/Dockerfile +55 -0
  18. runport-0.1.0/LICENSE +202 -0
  19. runport-0.1.0/NOTICE +6 -0
  20. runport-0.1.0/PKG-INFO +342 -0
  21. runport-0.1.0/README.md +288 -0
  22. runport-0.1.0/SECURITY.md +39 -0
  23. runport-0.1.0/assets/readme/architecture-dark.png +0 -0
  24. runport-0.1.0/assets/readme/architecture-light.png +0 -0
  25. runport-0.1.0/assets/readme/terminal-dashboard.png +0 -0
  26. runport-0.1.0/assets/readme/terminal-welcome.png +0 -0
  27. runport-0.1.0/assets/readme/web-approval.png +0 -0
  28. runport-0.1.0/assets/readme/web-budget-light.png +0 -0
  29. runport-0.1.0/assets/readme/web-plan.png +0 -0
  30. runport-0.1.0/assets/readme/web-results.png +0 -0
  31. runport-0.1.0/assets/runport-logo-black.png +0 -0
  32. runport-0.1.0/assets/runport-logo-white.png +0 -0
  33. runport-0.1.0/assets/runport_logo_ascii.txt +12 -0
  34. runport-0.1.0/assets/runport_logo_ascii_solid.txt +12 -0
  35. runport-0.1.0/data/evaluation/synthetic_seed_eval.jsonl +6 -0
  36. runport-0.1.0/data/evaluation/verified_rag_benchmark.jsonl +16 -0
  37. runport-0.1.0/data/traces/synthetic_langfuse_traces.csv +5 -0
  38. runport-0.1.0/data/traces/synthetic_langfuse_traces.json +125 -0
  39. runport-0.1.0/docs/ARCHITECTURE.md +90 -0
  40. runport-0.1.0/docs/CANONICAL_TRACE_SCHEMA.md +169 -0
  41. runport-0.1.0/docs/DECISIONS.md +69 -0
  42. runport-0.1.0/docs/GLOBAL_PRODUCT_READINESS_AUDIT.md +325 -0
  43. runport-0.1.0/docs/INVARIANT_TESTS.md +27 -0
  44. runport-0.1.0/docs/MCP_ARCHITECTURE.md +77 -0
  45. runport-0.1.0/docs/MULTI_USER_SECURITY_MODEL.md +97 -0
  46. runport-0.1.0/docs/README.md +38 -0
  47. runport-0.1.0/docs/ROADMAP_IMPLEMENTATION_AUDIT.md +268 -0
  48. runport-0.1.0/docs/ROADMAP_RELEASE_PLAN.md +69 -0
  49. runport-0.1.0/docs/SDK_API_CONTRACT.md +96 -0
  50. runport-0.1.0/docs/UNIVERSAL_EXECUTION_ARCHITECTURE.md +115 -0
  51. runport-0.1.0/docs/cli.md +147 -0
  52. runport-0.1.0/docs/competitive-positioning.md +262 -0
  53. runport-0.1.0/docs/concepts.md +60 -0
  54. runport-0.1.0/docs/config-reference.md +124 -0
  55. runport-0.1.0/docs/connectors/README.md +116 -0
  56. runport-0.1.0/docs/connectors/dify.md +101 -0
  57. runport-0.1.0/docs/connectors.md +200 -0
  58. runport-0.1.0/docs/design/universal-platform-spec.md +302 -0
  59. runport-0.1.0/docs/faq.md +33 -0
  60. runport-0.1.0/docs/index.md +37 -0
  61. runport-0.1.0/docs/metrics.md +174 -0
  62. runport-0.1.0/docs/quickstart.md +138 -0
  63. runport-0.1.0/docs/safety.md +131 -0
  64. runport-0.1.0/docs/web-ui.md +56 -0
  65. runport-0.1.0/examples/__init__.py +0 -0
  66. runport-0.1.0/examples/classification/README.md +19 -0
  67. runport-0.1.0/examples/classification/run.py +78 -0
  68. runport-0.1.0/examples/classification/synthetic_data.jsonl +5 -0
  69. runport-0.1.0/examples/dify-workflow/README.md +18 -0
  70. runport-0.1.0/examples/dify-workflow/run.py +71 -0
  71. runport-0.1.0/examples/http-workflow/README.md +18 -0
  72. runport-0.1.0/examples/http-workflow/run.py +62 -0
  73. runport-0.1.0/examples/knowledge_base/synthetic_kb.md +52 -0
  74. runport-0.1.0/examples/plugins/__init__.py +0 -0
  75. runport-0.1.0/examples/plugins/jev_decisions_api/__init__.py +0 -0
  76. runport-0.1.0/examples/plugins/jev_decisions_api/jev_adapter.py +293 -0
  77. runport-0.1.0/examples/plugins/jev_decisions_api/jev_payloads.py +171 -0
  78. runport-0.1.0/examples/plugins/jev_decisions_api/models.py +83 -0
  79. runport-0.1.0/examples/plugins/jev_decisions_api/tests/test_jev_payloads.py +187 -0
  80. runport-0.1.0/examples/plugins/kb_audit/__init__.py +0 -0
  81. runport-0.1.0/examples/plugins/kb_audit/audit/__init__.py +27 -0
  82. runport-0.1.0/examples/plugins/kb_audit/audit/models.py +121 -0
  83. runport-0.1.0/examples/plugins/kb_audit/audit/parser.py +290 -0
  84. runport-0.1.0/examples/plugins/kb_audit/audit/reporter.py +224 -0
  85. runport-0.1.0/examples/plugins/kb_audit/audit/validator.py +604 -0
  86. runport-0.1.0/examples/plugins/kb_audit/cli.py +224 -0
  87. runport-0.1.0/examples/plugins/kb_audit/remediation/__init__.py +19 -0
  88. runport-0.1.0/examples/plugins/kb_audit/remediation/engine.py +136 -0
  89. runport-0.1.0/examples/plugins/kb_audit/remediation/models.py +66 -0
  90. runport-0.1.0/examples/plugins/kb_audit/remediation/registry.py +150 -0
  91. runport-0.1.0/examples/plugins/kb_audit/tests/conftest.py +10 -0
  92. runport-0.1.0/examples/plugins/kb_audit/tests/fixtures/synthetic_programmes_kb.md +17 -0
  93. runport-0.1.0/examples/plugins/kb_audit/tests/test_audit.py +419 -0
  94. runport-0.1.0/examples/plugins/kb_audit/tests/test_remediation.py +85 -0
  95. runport-0.1.0/examples/python-callable/README.md +18 -0
  96. runport-0.1.0/examples/python-callable/eval.jsonl +2 -0
  97. runport-0.1.0/examples/python-callable/run.py +58 -0
  98. runport-0.1.0/examples/rag/README.md +20 -0
  99. runport-0.1.0/examples/rag/documents.jsonl +3 -0
  100. runport-0.1.0/examples/rag/eval.jsonl +3 -0
  101. runport-0.1.0/examples/rag/run.py +39 -0
  102. runport-0.1.0/examples/replay-demo/README.md +19 -0
  103. runport-0.1.0/examples/replay-demo/fixtures.jsonl +3 -0
  104. runport-0.1.0/examples/replay-demo/run.py +31 -0
  105. runport-0.1.0/mkdocs.yml +70 -0
  106. runport-0.1.0/pyproject.toml +124 -0
  107. runport-0.1.0/scripts/generate_landing_art.py +315 -0
  108. runport-0.1.0/scripts/make_ascii_logo.py +77 -0
  109. runport-0.1.0/src/runport/__init__.py +11 -0
  110. runport-0.1.0/src/runport/_web/apple-touch-icon.png +0 -0
  111. runport-0.1.0/src/runport/_web/assets/index-CJJA1jJ3.js +170 -0
  112. runport-0.1.0/src/runport/_web/assets/index-DDIDJwyV.css +1 -0
  113. runport-0.1.0/src/runport/_web/favicon-32.png +0 -0
  114. runport-0.1.0/src/runport/_web/favicon-512.png +0 -0
  115. runport-0.1.0/src/runport/_web/index.html +20 -0
  116. runport-0.1.0/src/runport/_web/runport-emblem.png +0 -0
  117. runport-0.1.0/src/runport/api/__init__.py +5 -0
  118. runport-0.1.0/src/runport/api/app.py +161 -0
  119. runport-0.1.0/src/runport/api/routes/budget.py +75 -0
  120. runport-0.1.0/src/runport/api/routes/datasets.py +130 -0
  121. runport-0.1.0/src/runport/api/routes/events.py +47 -0
  122. runport-0.1.0/src/runport/api/routes/models.py +64 -0
  123. runport-0.1.0/src/runport/api/routes/plan.py +45 -0
  124. runport-0.1.0/src/runport/api/routes/reports.py +243 -0
  125. runport-0.1.0/src/runport/api/routes/runs.py +199 -0
  126. runport-0.1.0/src/runport/api/routes/setup.py +88 -0
  127. runport-0.1.0/src/runport/api/routes/targets.py +215 -0
  128. runport-0.1.0/src/runport/catalog/__init__.py +6 -0
  129. runport-0.1.0/src/runport/catalog/models.py +23 -0
  130. runport-0.1.0/src/runport/catalog/openrouter.py +171 -0
  131. runport-0.1.0/src/runport/classification/__init__.py +65 -0
  132. runport-0.1.0/src/runport/classification/contracts.py +102 -0
  133. runport-0.1.0/src/runport/classification/metrics.py +236 -0
  134. runport-0.1.0/src/runport/classification/records.py +157 -0
  135. runport-0.1.0/src/runport/classification/runner.py +145 -0
  136. runport-0.1.0/src/runport/classification/splits.py +79 -0
  137. runport-0.1.0/src/runport/classification/threshold.py +200 -0
  138. runport-0.1.0/src/runport/classification/validators.py +49 -0
  139. runport-0.1.0/src/runport/cli/__init__.py +6 -0
  140. runport-0.1.0/src/runport/cli/commands/__init__.py +5 -0
  141. runport-0.1.0/src/runport/cli/commands/benchmarks.py +677 -0
  142. runport-0.1.0/src/runport/cli/commands/budget.py +221 -0
  143. runport-0.1.0/src/runport/cli/commands/datasets.py +159 -0
  144. runport-0.1.0/src/runport/cli/commands/init.py +49 -0
  145. runport-0.1.0/src/runport/cli/commands/models.py +40 -0
  146. runport-0.1.0/src/runport/cli/commands/plans.py +53 -0
  147. runport-0.1.0/src/runport/cli/commands/traces.py +180 -0
  148. runport-0.1.0/src/runport/cli/commands/ui.py +96 -0
  149. runport-0.1.0/src/runport/cli/main.py +169 -0
  150. runport-0.1.0/src/runport/connectors/__init__.py +29 -0
  151. runport-0.1.0/src/runport/connectors/dify.py +422 -0
  152. runport-0.1.0/src/runport/connectors/flowise.py +50 -0
  153. runport-0.1.0/src/runport/connectors/http_workflow.py +205 -0
  154. runport-0.1.0/src/runport/connectors/langflow.py +52 -0
  155. runport-0.1.0/src/runport/connectors/langgraph.py +48 -0
  156. runport-0.1.0/src/runport/connectors/mcp.py +920 -0
  157. runport-0.1.0/src/runport/connectors/n8n.py +44 -0
  158. runport-0.1.0/src/runport/connectors/ollama.py +156 -0
  159. runport-0.1.0/src/runport/connectors/openai_compat.py +176 -0
  160. runport-0.1.0/src/runport/connectors/openrouter.py +110 -0
  161. runport-0.1.0/src/runport/connectors/python_target.py +167 -0
  162. runport-0.1.0/src/runport/connectors/registry.py +530 -0
  163. runport-0.1.0/src/runport/core/__init__.py +1 -0
  164. runport-0.1.0/src/runport/core/approvers.py +177 -0
  165. runport-0.1.0/src/runport/core/budget.py +238 -0
  166. runport-0.1.0/src/runport/core/budget_policy.py +134 -0
  167. runport-0.1.0/src/runport/core/config.py +177 -0
  168. runport-0.1.0/src/runport/core/live_guard.py +80 -0
  169. runport-0.1.0/src/runport/core/plugins.py +43 -0
  170. runport-0.1.0/src/runport/core/security.py +137 -0
  171. runport-0.1.0/src/runport/core/workspace.py +359 -0
  172. runport-0.1.0/src/runport/dataset/__init__.py +18 -0
  173. runport-0.1.0/src/runport/dataset/leakage.py +150 -0
  174. runport-0.1.0/src/runport/dataset/manager.py +178 -0
  175. runport-0.1.0/src/runport/datasets/__init__.py +1 -0
  176. runport-0.1.0/src/runport/datasets/redaction.py +71 -0
  177. runport-0.1.0/src/runport/evaluation/__init__.py +10 -0
  178. runport-0.1.0/src/runport/evaluation/evaluator.py +77 -0
  179. runport-0.1.0/src/runport/evaluation/replay_scoring.py +97 -0
  180. runport-0.1.0/src/runport/evaluation/runner.py +128 -0
  181. runport-0.1.0/src/runport/mcp_server/__init__.py +1 -0
  182. runport-0.1.0/src/runport/mcp_server/server.py +444 -0
  183. runport-0.1.0/src/runport/models/__init__.py +1 -0
  184. runport-0.1.0/src/runport/models/catalog.py +115 -0
  185. runport-0.1.0/src/runport/models/registry.py +354 -0
  186. runport-0.1.0/src/runport/observability/__init__.py +1 -0
  187. runport-0.1.0/src/runport/observability/aggregate.py +262 -0
  188. runport-0.1.0/src/runport/observability/analysis.py +478 -0
  189. runport-0.1.0/src/runport/observability/annotation_templates.py +35 -0
  190. runport-0.1.0/src/runport/observability/budget_audit.py +157 -0
  191. runport-0.1.0/src/runport/observability/bundle_verify.py +161 -0
  192. runport-0.1.0/src/runport/observability/events.py +132 -0
  193. runport-0.1.0/src/runport/observability/export.py +1012 -0
  194. runport-0.1.0/src/runport/observability/labels.py +84 -0
  195. runport-0.1.0/src/runport/observability/monitor.py +160 -0
  196. runport-0.1.0/src/runport/providers/__init__.py +31 -0
  197. runport-0.1.0/src/runport/providers/base.py +195 -0
  198. runport-0.1.0/src/runport/providers/http.py +133 -0
  199. runport-0.1.0/src/runport/providers/openrouter.py +243 -0
  200. runport-0.1.0/src/runport/rag/__init__.py +23 -0
  201. runport-0.1.0/src/runport/rag/evaluator.py +79 -0
  202. runport-0.1.0/src/runport/rag/models.py +99 -0
  203. runport-0.1.0/src/runport/rag/retriever.py +215 -0
  204. runport-0.1.0/src/runport/rag/runner.py +311 -0
  205. runport-0.1.0/src/runport/rag/target.py +76 -0
  206. runport-0.1.0/src/runport/reports/__init__.py +5 -0
  207. runport-0.1.0/src/runport/reports/generator.py +207 -0
  208. runport-0.1.0/src/runport/runs/__init__.py +5 -0
  209. runport-0.1.0/src/runport/runs/executor.py +352 -0
  210. runport-0.1.0/src/runport/runs/planner.py +90 -0
  211. runport-0.1.0/src/runport/runs/replay.py +177 -0
  212. runport-0.1.0/src/runport/schemas/__init__.py +23 -0
  213. runport-0.1.0/src/runport/schemas/evaluation.py +114 -0
  214. runport-0.1.0/src/runport/schemas/execution.py +23 -0
  215. runport-0.1.0/src/runport/schemas/scoring.py +33 -0
  216. runport-0.1.0/src/runport/scorers/__init__.py +39 -0
  217. runport-0.1.0/src/runport/scorers/base.py +41 -0
  218. runport-0.1.0/src/runport/scorers/classification.py +224 -0
  219. runport-0.1.0/src/runport/scorers/extraction.py +100 -0
  220. runport-0.1.0/src/runport/scorers/generation.py +90 -0
  221. runport-0.1.0/src/runport/scorers/llm_judge.py +143 -0
  222. runport-0.1.0/src/runport/scorers/match.py +111 -0
  223. runport-0.1.0/src/runport/scorers/performance.py +136 -0
  224. runport-0.1.0/src/runport/scorers/stats.py +96 -0
  225. runport-0.1.0/src/runport/sdk.py +149 -0
  226. runport-0.1.0/src/runport/services/__init__.py +1 -0
  227. runport-0.1.0/src/runport/services/approvals.py +174 -0
  228. runport-0.1.0/src/runport/services/execution.py +322 -0
  229. runport-0.1.0/src/runport/storage/__init__.py +1 -0
  230. runport-0.1.0/src/runport/storage/db.py +635 -0
  231. runport-0.1.0/src/runport/targets/__init__.py +25 -0
  232. runport-0.1.0/src/runport/targets/base.py +185 -0
  233. runport-0.1.0/src/runport/traces/__init__.py +23 -0
  234. runport-0.1.0/src/runport/traces/analyzer.py +276 -0
  235. runport-0.1.0/src/runport/traces/importer.py +252 -0
  236. runport-0.1.0/src/runport/traces/models.py +76 -0
  237. runport-0.1.0/src/runport/traces/reporter.py +98 -0
  238. runport-0.1.0/src/runport/tui/__init__.py +5 -0
  239. runport-0.1.0/src/runport/tui/app.py +1000 -0
  240. runport-0.1.0/src/runport/tui/banner.py +22 -0
  241. runport-0.1.0/src/runport/tui/components.py +428 -0
  242. runport-0.1.0/src/runport/tui/health.py +184 -0
  243. runport-0.1.0/src/runport/tui/input.py +111 -0
  244. runport-0.1.0/src/runport/tui/live_views.py +991 -0
  245. runport-0.1.0/src/runport/tui/logo_ascii.py +79 -0
  246. runport-0.1.0/src/runport/tui/onboarding.py +204 -0
  247. runport-0.1.0/src/runport/tui/screens.py +1592 -0
  248. runport-0.1.0/src/runport/tui/telemetry.py +178 -0
  249. runport-0.1.0/src/runport/tui/theme.py +131 -0
  250. runport-0.1.0/src/runport/tui/welcome.py +376 -0
  251. runport-0.1.0/src/runport/workloads/__init__.py +34 -0
  252. runport-0.1.0/src/runport/workloads/base.py +29 -0
  253. runport-0.1.0/src/runport/workloads/classification.py +36 -0
  254. runport-0.1.0/src/runport/workloads/extraction.py +47 -0
  255. runport-0.1.0/src/runport/workloads/generation.py +32 -0
  256. runport-0.1.0/src/runport/workloads/rag.py +32 -0
  257. runport-0.1.0/tests/conftest.py +97 -0
  258. runport-0.1.0/tests/fixtures/mcp_fixture_server.py +110 -0
  259. runport-0.1.0/tests/fixtures/mcp_local_target.py +5 -0
  260. runport-0.1.0/tests/fixtures/openrouter_models_fixture.json +35 -0
  261. runport-0.1.0/tests/live_fakes.py +70 -0
  262. runport-0.1.0/tests/obs_helpers.py +136 -0
  263. runport-0.1.0/tests/registry_helpers.py +13 -0
  264. runport-0.1.0/tests/test_api_hardened.py +212 -0
  265. runport-0.1.0/tests/test_approvers.py +63 -0
  266. runport-0.1.0/tests/test_budget.py +221 -0
  267. runport-0.1.0/tests/test_budget_policy.py +142 -0
  268. runport-0.1.0/tests/test_budget_reservations.py +164 -0
  269. runport-0.1.0/tests/test_capability_registry.py +114 -0
  270. runport-0.1.0/tests/test_catalog_openrouter.py +100 -0
  271. runport-0.1.0/tests/test_classification.py +315 -0
  272. runport-0.1.0/tests/test_cli_execution.py +190 -0
  273. runport-0.1.0/tests/test_connector_contracts.py +263 -0
  274. runport-0.1.0/tests/test_connectors.py +266 -0
  275. runport-0.1.0/tests/test_core_invariants.py +263 -0
  276. runport-0.1.0/tests/test_dashboard_live.py +359 -0
  277. runport-0.1.0/tests/test_dataset.py +158 -0
  278. runport-0.1.0/tests/test_dify_connector.py +69 -0
  279. runport-0.1.0/tests/test_e2e_generic_runner.py +160 -0
  280. runport-0.1.0/tests/test_env_config.py +107 -0
  281. runport-0.1.0/tests/test_honest_scoring.py +221 -0
  282. runport-0.1.0/tests/test_integrity_security.py +282 -0
  283. runport-0.1.0/tests/test_key_reader_pty.py +63 -0
  284. runport-0.1.0/tests/test_landing_connectors.py +39 -0
  285. runport-0.1.0/tests/test_launcher_pty.py +145 -0
  286. runport-0.1.0/tests/test_ledger_simulated.py +152 -0
  287. runport-0.1.0/tests/test_live_safety.py +808 -0
  288. runport-0.1.0/tests/test_logo_ascii.py +141 -0
  289. runport-0.1.0/tests/test_mcp_connector.py +291 -0
  290. runport-0.1.0/tests/test_mcp_server.py +155 -0
  291. runport-0.1.0/tests/test_model_registry.py +118 -0
  292. runport-0.1.0/tests/test_observability_analysis.py +176 -0
  293. runport-0.1.0/tests/test_observability_events.py +130 -0
  294. runport-0.1.0/tests/test_offline_examples.py +34 -0
  295. runport-0.1.0/tests/test_onboarding.py +344 -0
  296. runport-0.1.0/tests/test_plugins.py +18 -0
  297. runport-0.1.0/tests/test_providers.py +211 -0
  298. runport-0.1.0/tests/test_rag_benchmark.py +287 -0
  299. runport-0.1.0/tests/test_redaction.py +35 -0
  300. runport-0.1.0/tests/test_replay.py +96 -0
  301. runport-0.1.0/tests/test_runs_engine.py +137 -0
  302. runport-0.1.0/tests/test_schemas.py +111 -0
  303. runport-0.1.0/tests/test_scorers_recompute.py +124 -0
  304. runport-0.1.0/tests/test_scorers_stats.py +71 -0
  305. runport-0.1.0/tests/test_sdk.py +63 -0
  306. runport-0.1.0/tests/test_ssrf_security.py +50 -0
  307. runport-0.1.0/tests/test_trace_export.py +576 -0
  308. runport-0.1.0/tests/test_traces.py +229 -0
  309. runport-0.1.0/tests/test_tui.py +940 -0
  310. runport-0.1.0/tests/test_unresolved_spend.py +88 -0
  311. runport-0.1.0/tests/test_web_api.py +361 -0
  312. runport-0.1.0/tests/test_workloads_and_scorers.py +159 -0
  313. runport-0.1.0/tests/test_workspace.py +73 -0
  314. runport-0.1.0/uv.lock +2959 -0
  315. runport-0.1.0/web/docs/app/Article.tsx +209 -0
  316. runport-0.1.0/web/docs/app/DocsApp.tsx +83 -0
  317. runport-0.1.0/web/docs/app/Home.tsx +92 -0
  318. runport-0.1.0/web/docs/app/Layout.tsx +82 -0
  319. runport-0.1.0/web/docs/app/SearchDialog.tsx +136 -0
  320. runport-0.1.0/web/docs/app/Sidebar.tsx +122 -0
  321. runport-0.1.0/web/docs/app/content.ts +144 -0
  322. runport-0.1.0/web/docs/app/docs.css +273 -0
  323. runport-0.1.0/web/docs/app/markdown.ts +213 -0
  324. runport-0.1.0/web/docs/app/router.ts +31 -0
  325. runport-0.1.0/web/docs/app/site.ts +10 -0
  326. runport-0.1.0/web/docs/content/approval-policies.md +46 -0
  327. runport-0.1.0/web/docs/content/architecture.md +46 -0
  328. runport-0.1.0/web/docs/content/benchmarks.md +30 -0
  329. runport-0.1.0/web/docs/content/budget-guardrails.md +54 -0
  330. runport-0.1.0/web/docs/content/classification.md +59 -0
  331. runport-0.1.0/web/docs/content/cli-budget.md +64 -0
  332. runport-0.1.0/web/docs/content/cli-commands.md +144 -0
  333. runport-0.1.0/web/docs/content/cli-examples.md +66 -0
  334. runport-0.1.0/web/docs/content/cli-overview.md +50 -0
  335. runport-0.1.0/web/docs/content/common-errors.md +52 -0
  336. runport-0.1.0/web/docs/content/comparing-runs.md +38 -0
  337. runport-0.1.0/web/docs/content/contribution-guidelines.md +28 -0
  338. runport-0.1.0/web/docs/content/cost-analysis.md +65 -0
  339. runport-0.1.0/web/docs/content/creating-benchmarks.md +100 -0
  340. runport-0.1.0/web/docs/content/custom-http.md +55 -0
  341. runport-0.1.0/web/docs/content/dashboards.md +50 -0
  342. runport-0.1.0/web/docs/content/datasets.md +65 -0
  343. runport-0.1.0/web/docs/content/development-setup.md +51 -0
  344. runport-0.1.0/web/docs/content/dify.md +54 -0
  345. runport-0.1.0/web/docs/content/environment-variables.md +27 -0
  346. runport-0.1.0/web/docs/content/executing-runs.md +71 -0
  347. runport-0.1.0/web/docs/content/exporting-traces.md +47 -0
  348. runport-0.1.0/web/docs/content/extraction.md +36 -0
  349. runport-0.1.0/web/docs/content/faq.md +44 -0
  350. runport-0.1.0/web/docs/content/flowise.md +33 -0
  351. runport-0.1.0/web/docs/content/generation.md +42 -0
  352. runport-0.1.0/web/docs/content/ground-truth.md +35 -0
  353. runport-0.1.0/web/docs/content/installation.md +70 -0
  354. runport-0.1.0/web/docs/content/integrating-projects.md +82 -0
  355. runport-0.1.0/web/docs/content/introduction.md +40 -0
  356. runport-0.1.0/web/docs/content/invariants.md +53 -0
  357. runport-0.1.0/web/docs/content/langflow.md +33 -0
  358. runport-0.1.0/web/docs/content/langgraph.md +40 -0
  359. runport-0.1.0/web/docs/content/latency.md +40 -0
  360. runport-0.1.0/web/docs/content/mcp.md +108 -0
  361. runport-0.1.0/web/docs/content/n8n.md +38 -0
  362. runport-0.1.0/web/docs/content/ollama.md +38 -0
  363. runport-0.1.0/web/docs/content/openai-compatible.md +54 -0
  364. runport-0.1.0/web/docs/content/openrouter.md +50 -0
  365. runport-0.1.0/web/docs/content/plugins.md +50 -0
  366. runport-0.1.0/web/docs/content/provider-configuration.md +33 -0
  367. runport-0.1.0/web/docs/content/provider-errors.md +46 -0
  368. runport-0.1.0/web/docs/content/python-integrations.md +49 -0
  369. runport-0.1.0/web/docs/content/quality-metrics.md +60 -0
  370. runport-0.1.0/web/docs/content/quickstart.md +68 -0
  371. runport-0.1.0/web/docs/content/rag-benchmarks.md +41 -0
  372. runport-0.1.0/web/docs/content/rag-evaluation.md +50 -0
  373. runport-0.1.0/web/docs/content/reproducibility.md +44 -0
  374. runport-0.1.0/web/docs/content/running-tests.md +34 -0
  375. runport-0.1.0/web/docs/content/runs-and-plans.md +64 -0
  376. runport-0.1.0/web/docs/content/scorers.md +58 -0
  377. runport-0.1.0/web/docs/content/token-usage.md +28 -0
  378. runport-0.1.0/web/docs/content/understanding-results.md +57 -0
  379. runport-0.1.0/web/docs/content/vllm.md +30 -0
  380. runport-0.1.0/web/docs/content/workspace-file.md +86 -0
  381. runport-0.1.0/web/docs/index.html +24 -0
  382. runport-0.1.0/web/docs/main.tsx +12 -0
  383. runport-0.1.0/web/docs/public/apple-touch-icon.png +0 -0
  384. runport-0.1.0/web/docs/public/emblem.png +0 -0
  385. runport-0.1.0/web/docs/public/favicon-32.png +0 -0
  386. runport-0.1.0/web/docs/public/favicon-512.png +0 -0
  387. runport-0.1.0/web/docs/public/logo.svg +6 -0
  388. runport-0.1.0/web/docs/vite-env.d.ts +1 -0
  389. runport-0.1.0/web/index.html +19 -0
  390. runport-0.1.0/web/landing/index.html +29 -0
  391. runport-0.1.0/web/landing/main.tsx +11 -0
  392. runport-0.1.0/web/landing/public/apple-touch-icon.png +0 -0
  393. runport-0.1.0/web/landing/public/assets/landing/hero-bg.png +0 -0
  394. runport-0.1.0/web/landing/public/assets/landing/logos/anthropic.svg +1 -0
  395. runport-0.1.0/web/landing/public/assets/landing/logos/crewai.svg +1 -0
  396. runport-0.1.0/web/landing/public/assets/landing/logos/deepinfra.svg +1 -0
  397. runport-0.1.0/web/landing/public/assets/landing/logos/deepseek.svg +1 -0
  398. runport-0.1.0/web/landing/public/assets/landing/logos/dify.svg +1 -0
  399. runport-0.1.0/web/landing/public/assets/landing/logos/docker.svg +1 -0
  400. runport-0.1.0/web/landing/public/assets/landing/logos/fireworks.svg +1 -0
  401. runport-0.1.0/web/landing/public/assets/landing/logos/flowise.png +0 -0
  402. runport-0.1.0/web/landing/public/assets/landing/logos/gemini.svg +1 -0
  403. runport-0.1.0/web/landing/public/assets/landing/logos/githubactions.svg +1 -0
  404. runport-0.1.0/web/landing/public/assets/landing/logos/groq.svg +1 -0
  405. runport-0.1.0/web/landing/public/assets/landing/logos/huggingface.svg +1 -0
  406. runport-0.1.0/web/landing/public/assets/landing/logos/langchain.svg +1 -0
  407. runport-0.1.0/web/landing/public/assets/landing/logos/langflow.svg +1 -0
  408. runport-0.1.0/web/landing/public/assets/landing/logos/langfuse.svg +1 -0
  409. runport-0.1.0/web/landing/public/assets/landing/logos/langgraph.svg +1 -0
  410. runport-0.1.0/web/landing/public/assets/landing/logos/llamaindex.svg +1 -0
  411. runport-0.1.0/web/landing/public/assets/landing/logos/lmstudio.svg +1 -0
  412. runport-0.1.0/web/landing/public/assets/landing/logos/meta.svg +1 -0
  413. runport-0.1.0/web/landing/public/assets/landing/logos/mistral.svg +1 -0
  414. runport-0.1.0/web/landing/public/assets/landing/logos/n8n.svg +1 -0
  415. runport-0.1.0/web/landing/public/assets/landing/logos/ollama.svg +1 -0
  416. runport-0.1.0/web/landing/public/assets/landing/logos/openai.svg +1 -0
  417. runport-0.1.0/web/landing/public/assets/landing/logos/openrouter.svg +1 -0
  418. runport-0.1.0/web/landing/public/assets/landing/logos/python.svg +1 -0
  419. runport-0.1.0/web/landing/public/assets/landing/logos/sqlite.svg +1 -0
  420. runport-0.1.0/web/landing/public/assets/landing/logos/together.svg +1 -0
  421. runport-0.1.0/web/landing/public/assets/landing/logos/vllm.svg +1 -0
  422. runport-0.1.0/web/landing/public/assets/landing/pricing-1.jpg +0 -0
  423. runport-0.1.0/web/landing/public/assets/landing/pricing-2.png +0 -0
  424. runport-0.1.0/web/landing/public/assets/landing/pricing-3.jpg +0 -0
  425. runport-0.1.0/web/landing/public/assets/landing/runport-emblem.png +0 -0
  426. runport-0.1.0/web/landing/public/assets/landing/runport-logo-black.png +0 -0
  427. runport-0.1.0/web/landing/public/assets/landing/runport-logo-white.png +0 -0
  428. runport-0.1.0/web/landing/public/assets/landing/testimonial-bg.jpg +0 -0
  429. runport-0.1.0/web/landing/public/favicon-32.png +0 -0
  430. runport-0.1.0/web/landing/public/favicon-512.png +0 -0
  431. runport-0.1.0/web/landing/public/logo.svg +6 -0
  432. runport-0.1.0/web/landing/public/robots.txt +2 -0
  433. runport-0.1.0/web/package-lock.json +1068 -0
  434. runport-0.1.0/web/package.json +32 -0
  435. runport-0.1.0/web/public/apple-touch-icon.png +0 -0
  436. runport-0.1.0/web/public/favicon-32.png +0 -0
  437. runport-0.1.0/web/public/favicon-512.png +0 -0
  438. runport-0.1.0/web/public/runport-emblem.png +0 -0
  439. runport-0.1.0/web/src/App.tsx +2201 -0
  440. runport-0.1.0/web/src/components/landing/BenchmarkFlow.tsx +260 -0
  441. runport-0.1.0/web/src/components/landing/BentoSection.tsx +77 -0
  442. runport-0.1.0/web/src/components/landing/FAQSection.tsx +67 -0
  443. runport-0.1.0/web/src/components/landing/FinalCTA.tsx +25 -0
  444. runport-0.1.0/web/src/components/landing/Footer.tsx +47 -0
  445. runport-0.1.0/web/src/components/landing/HeroSection.tsx +75 -0
  446. runport-0.1.0/web/src/components/landing/LandingPage.tsx +45 -0
  447. runport-0.1.0/web/src/components/landing/MetricsSection.tsx +51 -0
  448. runport-0.1.0/web/src/components/landing/Navigation.tsx +81 -0
  449. runport-0.1.0/web/src/components/landing/Pillars.tsx +267 -0
  450. runport-0.1.0/web/src/components/landing/PlatformSection.tsx +45 -0
  451. runport-0.1.0/web/src/components/landing/PricingSection.tsx +90 -0
  452. runport-0.1.0/web/src/components/landing/ProductReveal.tsx +23 -0
  453. runport-0.1.0/web/src/components/landing/ProductShowcase.tsx +130 -0
  454. runport-0.1.0/web/src/components/landing/RunAnywhere.tsx +81 -0
  455. runport-0.1.0/web/src/components/landing/RunIllustrations.tsx +106 -0
  456. runport-0.1.0/web/src/components/landing/RunportMockups.tsx +312 -0
  457. runport-0.1.0/web/src/components/landing/SampleChip.tsx +6 -0
  458. runport-0.1.0/web/src/components/landing/StackCards.tsx +300 -0
  459. runport-0.1.0/web/src/components/landing/StatementBanner.tsx +41 -0
  460. runport-0.1.0/web/src/components/landing/graphics/PlanApproval.tsx +44 -0
  461. runport-0.1.0/web/src/components/landing/graphics/ProductWindow.tsx +258 -0
  462. runport-0.1.0/web/src/components/landing/graphics/ResultsPanel.tsx +124 -0
  463. runport-0.1.0/web/src/components/landing/graphics/SpendGuard.tsx +55 -0
  464. runport-0.1.0/web/src/components/landing/graphics/TargetsOrbit.tsx +109 -0
  465. runport-0.1.0/web/src/components/landing/graphics/frames.ts +169 -0
  466. runport-0.1.0/web/src/components/landing/motion.tsx +83 -0
  467. runport-0.1.0/web/src/components/landing/motionKit.tsx +187 -0
  468. runport-0.1.0/web/src/data/connectors.ts +69 -0
  469. runport-0.1.0/web/src/data/ecosystem.ts +133 -0
  470. runport-0.1.0/web/src/data/landingContent.ts +495 -0
  471. runport-0.1.0/web/src/data/sampleRun.ts +257 -0
  472. runport-0.1.0/web/src/index.css +874 -0
  473. runport-0.1.0/web/src/main.tsx +11 -0
  474. runport-0.1.0/web/src/styles/bento.css +239 -0
  475. runport-0.1.0/web/src/styles/landing.css +821 -0
  476. runport-0.1.0/web/tests/e2e/bento-layout.e2e.mjs +167 -0
  477. runport-0.1.0/web/tests/frames.test.ts +137 -0
  478. runport-0.1.0/web/tests/sampleRun.test.ts +80 -0
  479. runport-0.1.0/web/tsconfig.json +26 -0
  480. runport-0.1.0/web/tsconfig.node.json +11 -0
  481. runport-0.1.0/web/vite.config.ts +21 -0
  482. runport-0.1.0/web/vite.docs.config.ts +19 -0
  483. runport-0.1.0/web/vite.landing.config.ts +37 -0
@@ -0,0 +1,23 @@
1
+ __pycache__
2
+ *.py[cod]
3
+ *$py.class
4
+ *.so
5
+ .venv
6
+ venv
7
+ env
8
+ .pytest_cache
9
+ .coverage
10
+ htmlcov
11
+ .mypy_cache
12
+ .ruff_cache
13
+ .DS_Store
14
+ .git
15
+ .github
16
+ data/*.db*
17
+ data/*.sqlite*
18
+ /reports
19
+ scratch
20
+ node_modules
21
+ web/node_modules
22
+ web/dist
23
+ docs/PROGRESS*.md
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: Bug Report
3
+ about: Create a report to help us improve Runport
4
+ title: "[BUG] "
5
+ labels: ["bug"]
6
+ assignees: []
7
+ ---
8
+
9
+ **Describe the bug**
10
+ A clear and concise description of what the bug is.
11
+
12
+ **To Reproduce**
13
+ Steps to reproduce the behavior:
14
+ 1. Run command: `runport ...`
15
+ 2. With configuration / dataset: `...`
16
+ 3. See error output: `...`
17
+
18
+ **Expected behavior**
19
+ A clear and concise description of what you expected to happen.
20
+
21
+ **Environment details:**
22
+ - OS: [e.g. macOS 14.5, Ubuntu 22.04, Windows 11]
23
+ - Python version: [e.g. 3.11.7, 3.12.3]
24
+ - Runport version: [e.g. 0.1.0]
25
+ - Terminal / Shell: [e.g. zsh, bash, PowerShell]
26
+
27
+ **Additional context**
28
+ Add any other context about the problem here (remember: NEVER include live API keys, bearer tokens, or private dataset records).
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: Connector Request
3
+ about: Propose support for a new LLM provider, workflow engine, or API protocol
4
+ title: "[CONNECTOR] "
5
+ labels: ["connector", "enhancement"]
6
+ assignees: []
7
+ ---
8
+
9
+ **Target System or Service**
10
+ - Name: [e.g. LangGraph Studio, vLLM, Bedrock, Mistral API]
11
+ - Documentation URL:
12
+ - Protocol: [REST / SSE streaming / WebSocket / gRPC / Python library]
13
+
14
+ **Capabilities Supported**
15
+ - [ ] Non-streaming completion
16
+ - [ ] Server-Sent Events (SSE) streaming
17
+ - [ ] Token usage telemetry (prompt / completion tokens)
18
+ - [ ] Native cost reporting
19
+ - [ ] Logprobs / Confidence scores
20
+ - [ ] Structured JSON output schema enforcement
21
+
22
+ **Authentication & Network Security**
23
+ How are credentials provided? (e.g. Header `Authorization: Bearer $ENV_VAR`, query parameter).
24
+ Does the target service support local offline emulation or mock servers?
25
+
26
+ **Reference Implementation or API Snippet**
27
+ Provide a curl command or minimal Python snippet demonstrating request and response payloads.
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: Feature Request
3
+ about: Suggest an idea or enhancement for Runport
4
+ title: "[FEATURE] "
5
+ labels: ["enhancement"]
6
+ assignees: []
7
+ ---
8
+
9
+ **Is your feature request related to a problem? Please describe.**
10
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
11
+
12
+ **Describe the solution you'd like**
13
+ A clear and concise description of what you want to happen.
14
+
15
+ **Describe alternatives you've considered**
16
+ A clear and concise description of any alternative solutions or features you've considered.
17
+
18
+ **Safety & Invariant Considerations**
19
+ Does this feature interact with budget caps, telemetry privacy, ground-truth annotations, or approval models?
20
+ - [ ] Preserves fail-closed spend caps
21
+ - [ ] Preserves zero-leakage secret scrubbing
22
+ - [ ] Maintains honest provenance (`ACTUAL`, `ESTIMATED`, `UNRESOLVED`, `UNAVAILABLE`)
23
+ - [ ] Offline testable
@@ -0,0 +1,12 @@
1
+ ## Description
2
+ Briefly describe the purpose of this change and link relevant issues.
3
+
4
+ ## Checklist
5
+ - [ ] Conforms to repository invariants in `AGENTS.md` and `docs/DECISIONS.md`.
6
+ - [ ] No fabricated telemetry (missing values remain `None` / `UNAVAILABLE`).
7
+ - [ ] Spend limits and preflight plan approvals preserved.
8
+ - [ ] Secrets and API keys are automatically scrubbed from request logs and exports.
9
+ - [ ] Offline tests added under `tests/` with simulated transports.
10
+ - [ ] All tests pass: `uv run pytest` and `uv run pytest examples/plugins`.
11
+ - [ ] Linting and type checking pass: `uv run ruff check` and `uv run mypy`.
12
+ - [ ] No personal paths, usernames, or live credentials committed.
@@ -0,0 +1,19 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "pip"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ open-pull-requests-limit: 10
8
+
9
+ - package-ecosystem: "npm"
10
+ directory: "/web"
11
+ schedule:
12
+ interval: "weekly"
13
+ open-pull-requests-limit: 10
14
+
15
+ - package-ecosystem: "github-actions"
16
+ directory: "/"
17
+ schedule:
18
+ interval: "weekly"
19
+ open-pull-requests-limit: 10
@@ -0,0 +1,164 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+
9
+ concurrency:
10
+ group: ${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ lint:
15
+ name: Lint & Code Style
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - name: Checkout repository
19
+ uses: actions/checkout@v4
20
+
21
+ - name: Set up uv
22
+ uses: astral-sh/setup-uv@v5
23
+ with:
24
+ enable-cache: true
25
+
26
+ - name: Install dependencies
27
+ run: uv sync --extra dev
28
+
29
+ - name: Run Ruff Linter
30
+ run: uv run ruff check
31
+
32
+ - name: Run Ruff Formatter Check
33
+ run: uv run ruff format --check
34
+
35
+ type-check:
36
+ name: Type Check (mypy)
37
+ runs-on: ubuntu-latest
38
+ steps:
39
+ - name: Checkout repository
40
+ uses: actions/checkout@v4
41
+
42
+ - name: Set up uv
43
+ uses: astral-sh/setup-uv@v5
44
+ with:
45
+ enable-cache: true
46
+
47
+ - name: Install dependencies
48
+ run: uv sync --extra dev
49
+
50
+ - name: Run mypy
51
+ run: uv run mypy
52
+
53
+ security-and-scan:
54
+ name: Security & Legacy Scans
55
+ runs-on: ubuntu-latest
56
+ steps:
57
+ - name: Checkout repository
58
+ uses: actions/checkout@v4
59
+ with:
60
+ fetch-depth: 0
61
+
62
+ - name: Run Gitleaks Scan
63
+ uses: gitleaks/gitleaks-action@v2
64
+ env:
65
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
66
+
67
+ - name: Run Legacy Pattern Scan
68
+ run: |
69
+ echo "Verifying zero legacy tokens outside approved exceptions..."
70
+ # Legacy identifiers from the project's earlier domain. Generic English words ("lead", "intent") were removed:
71
+ # they matched ordinary prose and UI text, so the scan could never pass. References to the approved
72
+ # jev_decisions_api example plugin are allowed wherever they appear.
73
+ MATCHES=$(git ls-files -z | grep -zv -e package-lock -e uv.lock | xargs -0 grep -niIE "msu|jev|admission|whatsapp|user4|counsellor|/Users/" | grep -v -E "(LICENSE:|examples/plugins/jev_decisions_api/|docs/INVARIANT_TESTS.md:|CODE_OF_CONDUCT.md:|jev_decisions_api)" || true)
74
+ if [ -n "$MATCHES" ]; then
75
+ echo "Legacy scan failed! Forbidden patterns found:"
76
+ echo "$MATCHES"
77
+ exit 1
78
+ fi
79
+ echo "Legacy scan passed cleanly."
80
+
81
+ test:
82
+ name: Test (Python ${{ matrix.python-version }} on ${{ matrix.os }})
83
+ runs-on: ${{ matrix.os }}
84
+ strategy:
85
+ fail-fast: false
86
+ matrix:
87
+ os: [ubuntu-latest, macos-latest, windows-latest]
88
+ python-version: ["3.11", "3.12", "3.13"]
89
+
90
+ steps:
91
+ - name: Checkout repository
92
+ uses: actions/checkout@v4
93
+
94
+ - name: Set up Python ${{ matrix.python-version }}
95
+ uses: actions/setup-python@v5
96
+ with:
97
+ python-version: ${{ matrix.python-version }}
98
+
99
+ - name: Set up uv
100
+ uses: astral-sh/setup-uv@v5
101
+ with:
102
+ enable-cache: true
103
+
104
+ - name: Install dependencies
105
+ run: uv sync --extra dev --extra report
106
+
107
+ - name: Run Core Test Suite
108
+ run: uv run pytest -v
109
+
110
+ - name: Run Plugin Test Suite
111
+ run: uv run pytest -v examples/plugins
112
+
113
+ wheel-and-smoke:
114
+ name: Web Build & Wheel Smoke Test
115
+ runs-on: ubuntu-latest
116
+ steps:
117
+ - name: Checkout repository
118
+ uses: actions/checkout@v4
119
+
120
+ - name: Set up Node.js 20
121
+ uses: actions/setup-node@v4
122
+ with:
123
+ node-version: 20
124
+
125
+ - name: Build Web Dashboard
126
+ working-directory: web
127
+ run: |
128
+ npm ci
129
+ # the lockfile was generated on macOS; add Rollup's Linux binary (npm/cli#4828)
130
+ npm install --no-save @rollup/rollup-linux-x64-gnu
131
+ npm run build
132
+ mkdir -p ../src/runport/_web
133
+ cp -r dist/* ../src/runport/_web/
134
+
135
+ - name: Set up Python
136
+ uses: actions/setup-python@v5
137
+ with:
138
+ python-version: "3.11"
139
+
140
+ - name: Set up uv
141
+ uses: astral-sh/setup-uv@v5
142
+ with:
143
+ enable-cache: true
144
+
145
+ - name: Build Wheel
146
+ run: uv build
147
+
148
+ - name: Install Wheel in Isolated Environment
149
+ run: |
150
+ uv venv test-env
151
+ uv pip install --python test-env/bin/python dist/*.whl
152
+
153
+ - name: Smoke Test Wheel CLI & Server
154
+ run: |
155
+ test-env/bin/runport --help
156
+ # Without OPENROUTER_API_KEY the preflight must fail closed (exit 1); CI never has a key.
157
+ if test-env/bin/runport api-preflight; then echo "api-preflight should exit 1 without a key"; exit 1; fi
158
+ test-env/bin/runport budget status
159
+ # Launch background web service and check health
160
+ test-env/bin/runport web --port 8000 &
161
+ PID=$!
162
+ sleep 3
163
+ curl -sf http://127.0.0.1:8000/api/health || (kill $PID && exit 1)
164
+ kill $PID
@@ -0,0 +1,56 @@
1
+ name: Deploy landing page
2
+
3
+ # Builds the public landing page and the docs portal (web/, `npm run build:site`)
4
+ # and publishes them to GitHub Pages at https://<owner>.github.io/Runport/.
5
+ on:
6
+ push:
7
+ branches: [main]
8
+ paths:
9
+ - 'web/**'
10
+ - '.github/workflows/pages.yml'
11
+ workflow_dispatch:
12
+
13
+ permissions:
14
+ contents: read
15
+ pages: write
16
+ id-token: write
17
+
18
+ concurrency:
19
+ group: pages
20
+ cancel-in-progress: true
21
+
22
+ jobs:
23
+ build:
24
+ runs-on: ubuntu-latest
25
+ defaults:
26
+ run:
27
+ working-directory: web
28
+ steps:
29
+ - uses: actions/checkout@v4
30
+ - uses: actions/setup-node@v4
31
+ with:
32
+ node-version: 22
33
+ cache: npm
34
+ cache-dependency-path: web/package-lock.json
35
+ - run: npm ci
36
+ # the lockfile was generated on macOS; add Rollup's Linux binary (npm/cli#4828)
37
+ - run: npm install --no-save @rollup/rollup-linux-x64-gnu
38
+ - run: npm test
39
+ - name: Build landing page and docs
40
+ run: npm run build:site
41
+ env:
42
+ LANDING_BASE: /${{ github.event.repository.name }}/
43
+ VITE_SITE_URL: /${{ github.event.repository.name }}/
44
+ - uses: actions/upload-pages-artifact@v3
45
+ with:
46
+ path: web/dist-landing
47
+
48
+ deploy:
49
+ needs: build
50
+ runs-on: ubuntu-latest
51
+ environment:
52
+ name: github-pages
53
+ url: ${{ steps.deployment.outputs.page_url }}
54
+ steps:
55
+ - id: deployment
56
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,165 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ jobs:
9
+ build:
10
+ name: Build Distributions & Web Dashboard
11
+ runs-on: ubuntu-latest
12
+ permissions:
13
+ contents: read
14
+ steps:
15
+ - name: Checkout repository
16
+ uses: actions/checkout@v4
17
+ with:
18
+ fetch-depth: 0
19
+
20
+ - name: Set up Node.js 20
21
+ uses: actions/setup-node@v4
22
+ with:
23
+ node-version: 20
24
+
25
+ - name: Build Web Dashboard
26
+ working-directory: web
27
+ run: |
28
+ npm ci
29
+ # The lockfile was generated on macOS; add Rollup's Linux binary (npm/cli#4828)
30
+ npm install --no-save @rollup/rollup-linux-x64-gnu
31
+ npm run build
32
+ mkdir -p ../src/runport/_web
33
+ cp -r dist/* ../src/runport/_web/
34
+
35
+ - name: Set up uv
36
+ uses: astral-sh/setup-uv@v5
37
+ with:
38
+ enable-cache: true
39
+
40
+ - name: Build Distributions (sdist and wheel)
41
+ run: uv build
42
+
43
+ - name: Upload Distribution Artifacts
44
+ uses: actions/upload-artifact@v4
45
+ with:
46
+ name: packages
47
+ path: dist/
48
+ retention-days: 7
49
+
50
+ verify:
51
+ name: Verify Wheel Clean Install (${{ matrix.os }})
52
+ needs: build
53
+ runs-on: ${{ matrix.os }}
54
+ strategy:
55
+ fail-fast: false
56
+ matrix:
57
+ os: [ubuntu-latest, macos-latest, windows-latest]
58
+ permissions:
59
+ contents: read
60
+ env:
61
+ PYTHONIOENCODING: utf-8
62
+ PYTHONUTF8: '1'
63
+ steps:
64
+ - name: Set up Python 3.11
65
+ uses: actions/setup-python@v5
66
+ with:
67
+ python-version: '3.11'
68
+
69
+ - name: Download Distribution Artifacts
70
+ uses: actions/download-artifact@v4
71
+ with:
72
+ name: packages
73
+ path: dist/
74
+
75
+ - name: Install Wheel in Isolated Environment
76
+ run: |
77
+ python -m pip install --upgrade pip
78
+ python -c "import glob, subprocess, sys; whl = glob.glob('dist/*.whl')[0]; subprocess.check_call([sys.executable, '-m', 'pip', 'install', whl])"
79
+
80
+ - name: Run CLI Smoke Checks
81
+ run: |
82
+ runport --help
83
+ runport --version
84
+
85
+ - name: Test Workspace Init
86
+ run: |
87
+ python -c "import subprocess, tempfile, os; d = tempfile.mkdtemp(); subprocess.check_call(['runport', 'init'], cwd=d)"
88
+
89
+ - name: Verify Bundled Web Assets
90
+ run: |
91
+ python -c "import runport; from pathlib import Path; p = Path(runport.__file__).parent / '_web' / 'index.html'; assert p.exists(), f'Missing web asset: {p}'; print('Web assets verified.')"
92
+
93
+ publish-pypi:
94
+ name: Publish to PyPI (Trusted Publishing)
95
+ needs: [build, verify]
96
+ runs-on: ubuntu-latest
97
+ environment:
98
+ name: pypi
99
+ url: https://pypi.org/p/runport
100
+ permissions:
101
+ id-token: write # Mandatory for PyPI Trusted Publishing OIDC
102
+ contents: read
103
+ steps:
104
+ - name: Download Distribution Artifacts
105
+ uses: actions/download-artifact@v4
106
+ with:
107
+ name: packages
108
+ path: dist/
109
+
110
+ - name: Publish Package to PyPI
111
+ uses: pypa/gh-action-pypi-publish@release/v1
112
+ with:
113
+ packages-dir: dist/
114
+
115
+ github-release:
116
+ name: Create GitHub Release
117
+ needs: [build, verify, publish-pypi]
118
+ runs-on: ubuntu-latest
119
+ permissions:
120
+ contents: write
121
+ steps:
122
+ - name: Checkout repository
123
+ uses: actions/checkout@v4
124
+
125
+ - name: Download Distribution Artifacts
126
+ uses: actions/download-artifact@v4
127
+ with:
128
+ name: packages
129
+ path: dist/
130
+
131
+ - name: Extract Release Notes & Prerelease Status
132
+ id: release_info
133
+ env:
134
+ TAG: ${{ github.ref_name }}
135
+ run: |
136
+ VERSION=${TAG#v}
137
+ echo "Extracting release notes for version $VERSION..."
138
+ python3 -c "
139
+ import os, re
140
+ tag = os.environ.get('TAG', '')
141
+ ver = tag.lstrip('v')
142
+ base_ver = ver.split('-')[0].split('+')[0]
143
+ content = open('CHANGELOG.md').read() if os.path.exists('CHANGELOG.md') else ''
144
+ pattern = r'## \[' + re.escape(ver) + r'\].*?\n(.*?)(?=\n## \[|\Z)'
145
+ match = re.search(pattern, content, re.DOTALL)
146
+ if not match and base_ver != ver:
147
+ fallback_pattern = r'## \[' + re.escape(base_ver) + r'\].*?\n(.*?)(?=\n## \[|\Z)'
148
+ match = re.search(fallback_pattern, content, re.DOTALL)
149
+ notes = match.group(1).strip() + '\n' if match else f'Release {tag}\n'
150
+ with open('RELEASE_NOTES.md', 'w') as f:
151
+ f.write(notes)
152
+
153
+ is_pre = 'true' if re.search(r'[-_\.]?(alpha|beta|rc|dev|preview|a\d|b\d)', tag, re.I) else 'false'
154
+ print(f'is_prerelease={is_pre}')
155
+ with open(os.environ['GITHUB_OUTPUT'], 'a') as f:
156
+ f.write(f'is_prerelease={is_pre}\n')
157
+ "
158
+
159
+ - name: Create GitHub Release
160
+ uses: softprops/action-gh-release@v2
161
+ with:
162
+ body_path: RELEASE_NOTES.md
163
+ files: dist/*
164
+ draft: false
165
+ prerelease: ${{ steps.release_info.outputs.is_prerelease == 'true' }}
@@ -0,0 +1,81 @@
1
+ # Bytecode and build artifacts
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ build/
7
+ dist/
8
+ site/
9
+ *.egg-info/
10
+ *.egg
11
+
12
+ # Virtual environments
13
+ .venv/
14
+ venv/
15
+ env/
16
+
17
+ # Test and coverage caches
18
+ .pytest_cache/
19
+ .coverage
20
+ htmlcov/
21
+ .mypy_cache/
22
+ .ruff_cache/
23
+
24
+ # OS and Editor artifacts
25
+ .DS_Store
26
+ .AppleDouble
27
+ .LSOverride
28
+ Icon
29
+ ._*
30
+ .Spotlight-V100
31
+ .Trashes
32
+ .idea/
33
+ .vscode/
34
+ *.swp
35
+ *.swo
36
+
37
+ # Environment and secrets (NEVER COMMIT)
38
+ .env
39
+ .env.*
40
+ *.pem
41
+ *.key
42
+ *.cert
43
+ secrets.json
44
+
45
+ # Local runtime databases, telemetry, and execution outputs (LOCAL ONLY)
46
+ data/*.db
47
+ data/*.db-wal
48
+ data/*.db-shm
49
+ data/*.sqlite*
50
+ data/*.json
51
+ !data/evaluation/
52
+ !data/traces/
53
+ data/classification_prep/
54
+ data/telemetry/
55
+ data/db/
56
+ data/cache/
57
+ /reports/
58
+
59
+ # Scratch and obsolete experiment directories
60
+ scratch/
61
+ experiments/
62
+
63
+ # Node.js and web frontend dependencies
64
+ node_modules/
65
+ web/node_modules/
66
+ web/dist/
67
+ web/dist-landing/
68
+ web/dist-docs/
69
+
70
+ # Progress and local scratch docs
71
+ docs/PROGRESS.md
72
+ docs/SCAN_NOTES.md
73
+ docs/PROGRESS_LOGO.md
74
+ docs/PROGRESS_FINISH.md
75
+ docs/PROGRESS_LANDING.md
76
+
77
+ # Landing-page audit screenshots (third-party reference captures; keep local)
78
+ artifacts/
79
+
80
+ # landing site build output
81
+ web/dist-landing/
@@ -0,0 +1,9 @@
1
+ b2eee1d72bb1e2d282d539f1f13ea7550311540c:examples/plugins/kb_audit/tests/test_audit.py:generic-api-key:398
2
+ c9a351004cd49eb404dfdc998c9a1be9ad1dc8a4:tests/test_env_config.py:generic-api-key:20
3
+ 7c2e2ec1afd475226228a0f1c2a602739b42d888:tests/classification/test_dataprep_hardening.py:generic-api-key:156
4
+ 60bcfc611a276c980b770c47d1717d52cb30d501:examples/plugins/kb_audit/tests/test_audit.py:generic-api-key:398
5
+ f995bdfdf148294bf95e2a3955376e19d6026f1e:tests/classification/test_real_benchmark.py:generic-api-key:28
6
+ # Placeholder values in docs examples and the landing-page animation (not secrets)
7
+ 1179841f06fe5713770e7493f4dd5fe6ad18ebd4:docs/SDK_API_CONTRACT.md:generic-api-key:53
8
+ 1179841f06fe5713770e7493f4dd5fe6ad18ebd4:docs/SDK_API_CONTRACT.md:generic-api-key:61
9
+ 40abbf0263875dff0f61f22ca0f3f8e229e5b94b:web/src/components/landing/FeatureBento.tsx:generic-api-key:141
@@ -0,0 +1,27 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v4.6.0
4
+ hooks:
5
+ - id: trailing-whitespace
6
+ exclude: ^web/package-lock\.json$
7
+ - id: end-of-file-fixer
8
+ exclude: ^web/package-lock\.json$
9
+ - id: check-yaml
10
+ args: [--unsafe]
11
+ exclude: ^mkdocs\.yml$
12
+ - id: check-json
13
+ exclude: ^web/package-lock\.json$
14
+ - id: check-added-large-files
15
+ args: [--maxkb=2000]
16
+
17
+ - repo: https://github.com/astral-sh/ruff-pre-commit
18
+ rev: v0.4.10
19
+ hooks:
20
+ - id: ruff
21
+ args: [--fix]
22
+ - id: ruff-format
23
+
24
+ - repo: https://github.com/gitleaks/gitleaks
25
+ rev: v8.18.4
26
+ hooks:
27
+ - id: gitleaks