rote-cli 0.15.0__tar.gz → 0.17.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 (245) hide show
  1. {rote_cli-0.15.0 → rote_cli-0.17.0}/LICENSE +12 -11
  2. rote_cli-0.15.0/README.md → rote_cli-0.17.0/PKG-INFO +169 -39
  3. rote_cli-0.15.0/PKG-INFO → rote_cli-0.17.0/README.md +105 -96
  4. rote_cli-0.17.0/examples/docs-digest/README.md +98 -0
  5. rote_cli-0.17.0/examples/docs-digest/compiled/backend.json +4 -0
  6. rote_cli-0.17.0/examples/docs-digest/compiled/compile-metrics.json +17 -0
  7. rote_cli-0.17.0/examples/docs-digest/compiled/compile-report.md +60 -0
  8. rote_cli-0.17.0/examples/docs-digest/compiled/declared-tools.json +134 -0
  9. rote_cli-0.17.0/examples/docs-digest/compiled/eval.yaml +40 -0
  10. rote_cli-0.17.0/examples/docs-digest/compiled/extracted/pick_reading_list.py +21 -0
  11. rote_cli-0.17.0/examples/docs-digest/compiled/extracted/read_repo_outline.py +19 -0
  12. rote_cli-0.17.0/examples/docs-digest/compiled/extracted/search_microsoft_learn.py +56 -0
  13. rote_cli-0.17.0/examples/docs-digest/compiled/extracted/write_digest.py +21 -0
  14. rote_cli-0.17.0/examples/docs-digest/compiled/pipeline.yaml +204 -0
  15. rote_cli-0.17.0/examples/docs-digest/compiled/provenance.json +33 -0
  16. rote_cli-0.17.0/examples/docs-digest/compiled/system1/brief.md +18 -0
  17. rote_cli-0.17.0/examples/docs-digest/compiled/system1/decisions.json +189 -0
  18. rote_cli-0.17.0/examples/docs-digest/compiled/system1/enforcement.json +4 -0
  19. rote_cli-0.17.0/examples/docs-digest/compiled/system1/interface.json +95 -0
  20. rote_cli-0.17.0/examples/docs-digest/compiled/system1/skeleton.yaml +98 -0
  21. rote_cli-0.17.0/examples/docs-digest/compiled/system1/text.yaml +122 -0
  22. rote_cli-0.17.0/examples/docs-digest/compiled/tests/test_pick_reading_list.py +43 -0
  23. rote_cli-0.17.0/examples/docs-digest/compiled/tests/test_write_digest.py +35 -0
  24. rote_cli-0.17.0/examples/docs-digest/reference.json +212 -0
  25. rote_cli-0.17.0/examples/docs-digest/skill/SKILL.md +43 -0
  26. rote_cli-0.17.0/examples/docs-digest/skill/input.json +1 -0
  27. rote_cli-0.17.0/examples/docs-digest/skill/mcp-tools.json +107 -0
  28. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/README.md +19 -9
  29. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/expected/extracted/audit.py +4 -2
  30. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/expected/extracted/report.py +22 -11
  31. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/expected/pipeline-draft.yaml +1 -0
  32. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/expected/pipeline.yaml +10 -2
  33. rote_cli-0.17.0/examples/expense-audit/fidelity/cases.yaml +68 -0
  34. rote_cli-0.17.0/examples/expense-audit/fidelity/reference.json +903 -0
  35. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/runs/2026-10-18-first-agent-run/eval.yaml +1 -1
  36. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/runs/2026-10-18-first-agent-run/pipeline.yaml +5 -1
  37. rote_cli-0.17.0/examples/expense-audit/skill/sample-input.json +25 -0
  38. {rote_cli-0.15.0 → rote_cli-0.17.0}/pyproject.toml +48 -10
  39. rote_cli-0.17.0/skills/rote-compile/GENERATE.md +186 -0
  40. {rote_cli-0.15.0 → rote_cli-0.17.0}/skills/rote-compile/SKILL.md +92 -35
  41. rote_cli-0.17.0/skills/rote-compile/SYSTEM1.md +110 -0
  42. {rote_cli-0.15.0 → rote_cli-0.17.0}/skills/rote-compile/references/crystallization-heuristics.md +9 -8
  43. {rote_cli-0.15.0 → rote_cli-0.17.0}/skills/rote-compile/references/implementation.md +124 -41
  44. {rote_cli-0.15.0 → rote_cli-0.17.0}/skills/rote-compile/references/ir-schema.md +53 -1
  45. {rote_cli-0.15.0 → rote_cli-0.17.0}/skills/rote-compile/references/llm-judge-extraction.md +54 -6
  46. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/__init__.py +1 -1
  47. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/__main__.py +1 -1
  48. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/adapters/__init__.py +18 -0
  49. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/adapters/_common.py +210 -31
  50. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/adapters/_py_common.py +191 -17
  51. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/adapters/_ts_common.py +927 -154
  52. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/adapters/cloudflare.py +26 -9
  53. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/adapters/dbos.py +74 -13
  54. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/adapters/dbos_ts.py +31 -4
  55. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/adapters/inngest.py +12 -4
  56. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/adapters/python.py +29 -36
  57. rote_cli-0.17.0/src/rote/adapters/skill.py +779 -0
  58. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/adapters/temporal.py +25 -8
  59. rote_cli-0.17.0/src/rote/app_registry.py +136 -0
  60. rote_cli-0.17.0/src/rote/bench/__init__.py +13 -0
  61. rote_cli-0.17.0/src/rote/bench/collect.py +375 -0
  62. rote_cli-0.17.0/src/rote/bench/fidelity.py +984 -0
  63. rote_cli-0.17.0/src/rote/bench/fidelity_score.py +710 -0
  64. rote_cli-0.17.0/src/rote/bench/fixture_mcp.py +138 -0
  65. rote_cli-0.17.0/src/rote/bench/http_fixtures.py +186 -0
  66. rote_cli-0.17.0/src/rote/bench/report.py +281 -0
  67. rote_cli-0.17.0/src/rote/bench/runner.py +786 -0
  68. rote_cli-0.17.0/src/rote/bench/score.py +805 -0
  69. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/cli.py +2467 -241
  70. rote_cli-0.17.0/src/rote/clients/__init__.py +89 -0
  71. rote_cli-0.17.0/src/rote/clients/amp.py +244 -0
  72. rote_cli-0.17.0/src/rote/clients/base.py +326 -0
  73. rote_cli-0.17.0/src/rote/clients/claude_code.py +574 -0
  74. rote_cli-0.17.0/src/rote/clients/claude_desktop.py +93 -0
  75. rote_cli-0.17.0/src/rote/clients/codex.py +236 -0
  76. rote_cli-0.17.0/src/rote/clients/collisions.py +81 -0
  77. rote_cli-0.17.0/src/rote/clients/common.py +399 -0
  78. rote_cli-0.17.0/src/rote/clients/copilot.py +200 -0
  79. rote_cli-0.17.0/src/rote/clients/cursor.py +139 -0
  80. rote_cli-0.17.0/src/rote/clients/gemini.py +337 -0
  81. rote_cli-0.17.0/src/rote/clients/goose.py +188 -0
  82. rote_cli-0.17.0/src/rote/clients/normalize.py +309 -0
  83. rote_cli-0.17.0/src/rote/clients/opencode.py +209 -0
  84. rote_cli-0.17.0/src/rote/clients/vscode.py +202 -0
  85. rote_cli-0.17.0/src/rote/clients/windsurf.py +159 -0
  86. rote_cli-0.17.0/src/rote/clients/zed.py +148 -0
  87. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/cloud_auth.py +2 -3
  88. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/cloud_compile.py +2 -1
  89. rote_cli-0.17.0/src/rote/compiler/__init__.py +1611 -0
  90. rote_cli-0.17.0/src/rote/compiler/_prefix_runner.py +329 -0
  91. rote_cli-0.17.0/src/rote/compiler/api_docs.py +432 -0
  92. rote_cli-0.17.0/src/rote/compiler/backend.py +59 -0
  93. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/compiler/drivers/__init__.py +59 -0
  94. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/compiler/drivers/_fs_tools.py +77 -31
  95. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/compiler/drivers/anthropic_api.py +398 -36
  96. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/compiler/drivers/claude.py +179 -16
  97. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/compiler/drivers/codex.py +105 -3
  98. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/compiler/drivers/openai_api.py +122 -34
  99. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/compiler/events.py +4 -0
  100. rote_cli-0.17.0/src/rote/compiler/grounding.py +740 -0
  101. rote_cli-0.17.0/src/rote/compiler/prefix.py +382 -0
  102. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/compiler/provenance.py +203 -56
  103. rote_cli-0.17.0/src/rote/compiler/replay.py +71 -0
  104. rote_cli-0.17.0/src/rote/compiler/report.py +282 -0
  105. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/compiler/sandbox.py +14 -5
  106. rote_cli-0.17.0/src/rote/compiler/system1/__init__.py +413 -0
  107. rote_cli-0.17.0/src/rote/compiler/system1/checker.py +110 -0
  108. rote_cli-0.17.0/src/rote/compiler/system1/decide.py +1137 -0
  109. rote_cli-0.17.0/src/rote/compiler/system1/decision_model.py +500 -0
  110. rote_cli-0.17.0/src/rote/compiler/system1/enforce.py +332 -0
  111. rote_cli-0.17.0/src/rote/compiler/system1/evidence.py +117 -0
  112. rote_cli-0.17.0/src/rote/compiler/system1/generate.py +1914 -0
  113. rote_cli-0.17.0/src/rote/compiler/system1/lane_call.py +238 -0
  114. rote_cli-0.17.0/src/rote/compiler/system1/parse.py +656 -0
  115. rote_cli-0.17.0/src/rote/compiler/system1/skeleton.py +448 -0
  116. rote_cli-0.17.0/src/rote/compiler/system1/structure.py +2256 -0
  117. rote_cli-0.17.0/src/rote/compiler/system1/tiebreak.py +430 -0
  118. rote_cli-0.17.0/src/rote/compiler/tool_grounding.py +970 -0
  119. rote_cli-0.17.0/src/rote/compiler/verify.py +1245 -0
  120. rote_cli-0.17.0/src/rote/compiler/worth.py +68 -0
  121. rote_cli-0.17.0/src/rote/config.py +510 -0
  122. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/contracts.py +56 -20
  123. rote_cli-0.17.0/src/rote/demo.py +338 -0
  124. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/deploy.py +8 -0
  125. rote_cli-0.17.0/src/rote/entry.py +44 -0
  126. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/eval/baseline.py +154 -54
  127. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/eval/empirical.py +249 -43
  128. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/eval/estimate.py +7 -2
  129. rote_cli-0.17.0/src/rote/eval/gate_server.py +143 -0
  130. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/eval/pricing.py +83 -3
  131. rote_cli-0.17.0/src/rote/eval/skill_ab.py +1497 -0
  132. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/examples.py +38 -4
  133. rote_cli-0.17.0/src/rote/extras.py +528 -0
  134. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/inference/__init__.py +10 -0
  135. rote_cli-0.17.0/src/rote/inference/_runtime_helper.py +2441 -0
  136. rote_cli-0.17.0/src/rote/init_wizard.py +328 -0
  137. rote_cli-0.17.0/src/rote/interact/__init__.py +7 -0
  138. rote_cli-0.17.0/src/rote/interact/agents.py +124 -0
  139. rote_cli-0.17.0/src/rote/interact/mode.py +145 -0
  140. rote_cli-0.17.0/src/rote/interact/output.py +81 -0
  141. rote_cli-0.17.0/src/rote/interact/plan.py +480 -0
  142. rote_cli-0.17.0/src/rote/interact/prompter.py +421 -0
  143. rote_cli-0.17.0/src/rote/interact/report.py +150 -0
  144. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/ir.py +488 -7
  145. rote_cli-0.17.0/src/rote/isolation.py +82 -0
  146. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/mcp/__init__.py +1 -1
  147. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/mcp/_runtime_helper.py +257 -23
  148. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/mcp/auth.py +105 -13
  149. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/mcp/live_tools.py +22 -17
  150. rote_cli-0.17.0/src/rote/mcp/pending_login.py +624 -0
  151. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/mcp/registry.py +64 -8
  152. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/mcp/release.py +4 -6
  153. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/mcp/tokens.py +2 -3
  154. rote_cli-0.17.0/src/rote/plan/__init__.py +505 -0
  155. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/probe.py +29 -6
  156. rote_cli-0.17.0/src/rote/proof.py +363 -0
  157. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/runners/__init__.py +154 -34
  158. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/runners/cloudflare.py +14 -1
  159. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/runners/dbos_ts.py +9 -6
  160. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/serve/__init__.py +1 -1
  161. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/serve/backends.py +8 -17
  162. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/serve/registry.py +81 -3
  163. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/serve/server.py +298 -25
  164. rote_cli-0.17.0/src/rote/setup/__init__.py +126 -0
  165. rote_cli-0.17.0/src/rote/setup/first_run.py +1294 -0
  166. rote_cli-0.17.0/src/rote/setup/install_extra.py +178 -0
  167. rote_cli-0.17.0/src/rote/setup/mcp_import.py +983 -0
  168. rote_cli-0.17.0/src/rote/setup/mcp_login.py +83 -0
  169. rote_cli-0.17.0/src/rote/setup/try_skill.py +1010 -0
  170. rote_cli-0.17.0/src/rote/skill_files.py +121 -0
  171. rote_cli-0.17.0/src/rote/skill_target/__init__.py +100 -0
  172. rote_cli-0.17.0/src/rote/skill_target/_driver.py +2439 -0
  173. rote_cli-0.17.0/src/rote/skill_target/allow_rule.py +140 -0
  174. rote_cli-0.17.0/src/rote/skill_target/commands.py +636 -0
  175. rote_cli-0.17.0/src/rote/skill_target/launch.py +336 -0
  176. rote_cli-0.17.0/src/rote/skill_target/next_steps.py +72 -0
  177. rote_cli-0.17.0/src/rote/skill_target/trust.py +703 -0
  178. rote_cli-0.17.0/src/rote/skills/__init__.py +26 -0
  179. rote_cli-0.17.0/src/rote/skills/discovery.py +475 -0
  180. rote_cli-0.17.0/src/rote/tool_schema.py +202 -0
  181. rote_cli-0.17.0/src/rote/vendor_specs/__init__.py +23 -0
  182. rote_cli-0.17.0/src/rote/vendor_specs/check.py +995 -0
  183. rote_cli-0.17.0/src/rote/vendor_specs/deps.py +210 -0
  184. rote_cli-0.17.0/src/rote/vendor_specs/docs.py +223 -0
  185. rote_cli-0.17.0/src/rote/vendor_specs/extract.py +1012 -0
  186. rote_cli-0.17.0/src/rote/vendor_specs/fake.py +208 -0
  187. rote_cli-0.17.0/src/rote/vendor_specs/fixture_store.py +91 -0
  188. rote_cli-0.17.0/src/rote/vendor_specs/fixtures.py +127 -0
  189. rote_cli-0.17.0/src/rote/vendor_specs/google.py +249 -0
  190. rote_cli-0.17.0/src/rote/vendor_specs/graphql.py +385 -0
  191. rote_cli-0.17.0/src/rote/vendor_specs/intercept/sitecustomize.py +219 -0
  192. rote_cli-0.17.0/src/rote/vendor_specs/live.py +880 -0
  193. rote_cli-0.17.0/src/rote/vendor_specs/model.py +203 -0
  194. rote_cli-0.17.0/src/rote/vendor_specs/openapi.py +380 -0
  195. rote_cli-0.17.0/src/rote/vendor_specs/psl.py +90 -0
  196. rote_cli-0.17.0/src/rote/vendor_specs/public_suffix_list.dat +16559 -0
  197. rote_cli-0.17.0/src/rote/vendor_specs/schema.py +80 -0
  198. rote_cli-0.17.0/src/rote/vendor_specs/store.py +274 -0
  199. rote_cli-0.17.0/src/rote/xdg.py +39 -0
  200. rote_cli-0.15.0/src/rote/app_registry.py +0 -85
  201. rote_cli-0.15.0/src/rote/compiler/__init__.py +0 -901
  202. rote_cli-0.15.0/src/rote/compiler/verify.py +0 -636
  203. rote_cli-0.15.0/src/rote/config.py +0 -237
  204. rote_cli-0.15.0/src/rote/extras.py +0 -138
  205. rote_cli-0.15.0/src/rote/inference/_runtime_helper.py +0 -1299
  206. rote_cli-0.15.0/src/rote/init_wizard.py +0 -169
  207. {rote_cli-0.15.0 → rote_cli-0.17.0}/.gitignore +0 -0
  208. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/eval-input.json +0 -0
  209. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/expected/eval.yaml +0 -0
  210. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/expected/extracted/checks.py +0 -0
  211. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/expected/extracted/fx.py +0 -0
  212. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/input.json +0 -0
  213. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/runs/2026-10-18-first-agent-run/compile-metrics.json +0 -0
  214. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/runs/2026-10-18-first-agent-run/compile-report.md +0 -0
  215. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/checks.py +0 -0
  216. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/fx.py +0 -0
  217. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/policy.py +0 -0
  218. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/report.py +0 -0
  219. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/runs/2026-10-18-first-agent-run/extracted/save.py +0 -0
  220. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/runs/2026-10-18-first-agent-run/provenance.json +0 -0
  221. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/scorecard.md +0 -0
  222. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/skill/SKILL.md +0 -0
  223. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/skill/references/expense-policy.md +0 -0
  224. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/skill/references/fx-rates.md +0 -0
  225. {rote_cli-0.15.0 → rote_cli-0.17.0}/examples/expense-audit/skill/references/report-format.md +0 -0
  226. {rote_cli-0.15.0 → rote_cli-0.17.0}/skills/rote-compile/references/eval-estimates.md +0 -0
  227. {rote_cli-0.15.0 → rote_cli-0.17.0}/skills/rote-compile/references/node-kinds.md +0 -0
  228. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/_dbos.py +0 -0
  229. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/compiler/drivers/_heartbeat.py +0 -0
  230. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/compiler/update.py +0 -0
  231. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/deploy_rote_cloud.py +0 -0
  232. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/eval/__init__.py +0 -0
  233. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/eval/infra_pricing.py +0 -0
  234. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/eval/priors.py +0 -0
  235. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/eval/scorecard.py +0 -0
  236. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/eval/sidecar.py +0 -0
  237. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/eval/tokens.py +0 -0
  238. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/mcp/client_metadata.json +0 -0
  239. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/mcp/learned.py +0 -0
  240. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/mcp/parked.py +0 -0
  241. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/py.typed +0 -0
  242. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/runners/_node.py +0 -0
  243. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/runners/inngest.py +0 -0
  244. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/runners/temporal.py +0 -0
  245. {rote_cli-0.15.0 → rote_cli-0.17.0}/src/rote/skill_source.py +0 -0
@@ -1,3 +1,4 @@
1
+
1
2
  Apache License
2
3
  Version 2.0, January 2004
3
4
  http://www.apache.org/licenses/
@@ -137,8 +138,8 @@
137
138
 
138
139
  6. Trademarks. This License does not grant permission to use the trade
139
140
  names, trademarks, service marks, or product names of the Licensor,
140
- except as required for describing the origin of the Work and
141
- reproducing the content of the NOTICE file.
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
142
143
 
143
144
  7. Disclaimer of Warranty. Unless required by applicable law or
144
145
  agreed to in writing, Licensor provides the Work (and each
@@ -163,15 +164,15 @@
163
164
  has been advised of the possibility of such damages.
164
165
 
165
166
  9. Accepting Warranty or Additional Liability. While redistributing
166
- the Work or Derivative Works thereof, You may accept and charge a
167
- fee for acceptance of support, warranty, indemnity, or other liability
168
- obligations and/or rights consistent with this License. However, in
169
- accepting such obligations, You may act only on Your own behalf and on
170
- Your sole responsibility, not on behalf of any other Contributor, and
171
- only if You agree to indemnify, defend, and hold each Contributor
172
- harmless for any liability incurred by, or claims asserted against,
173
- such Contributor by reason of your accepting any such warranty or
174
- additional liability.
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
175
176
 
176
177
  END OF TERMS AND CONDITIONS
177
178
 
@@ -1,3 +1,67 @@
1
+ Metadata-Version: 2.5
2
+ Name: rote-cli
3
+ Version: 0.17.0
4
+ Summary: Compile AI agent skills into cheap, fast, deterministic pipelines that run without an LLM in the loop
5
+ Project-URL: Homepage, https://roteskills.com
6
+ Project-URL: Repository, https://github.com/trevhud/rote
7
+ Project-URL: Documentation, https://github.com/trevhud/rote#readme
8
+ Project-URL: Changelog, https://github.com/trevhud/rote/blob/main/CHANGELOG.md
9
+ Project-URL: Issues, https://github.com/trevhud/rote/issues
10
+ Author-email: Trevor Hudson <trevhud@gmail.com>
11
+ License-Expression: Apache-2.0
12
+ License-File: LICENSE
13
+ Keywords: agent,agent-skills,agent-workflow,ai,anthropic,claude,claude-code,claude-skills,cloudflare,compilation,compiler,dbos,deterministic,dspy,durable-execution,inngest,llm,mcp,pipeline,skill,temporal,token-cost,workflow
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Environment :: Console
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
23
+ Classifier: Topic :: Software Development :: Code Generators
24
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
25
+ Classifier: Typing :: Typed
26
+ Requires-Python: >=3.11
27
+ Requires-Dist: fastmcp-slim[client]<5,>=4.1.3
28
+ Requires-Dist: graphql-core<4,>=3.3
29
+ Requires-Dist: httpx>=0.28
30
+ Requires-Dist: json5<1,>=0.17.3
31
+ Requires-Dist: pydantic>=2.7
32
+ Requires-Dist: pytest<10,>=9.0
33
+ Requires-Dist: pyyaml>=6.0
34
+ Requires-Dist: questionary<3,>=2.1.1
35
+ Requires-Dist: rich<16,>=15.0.0
36
+ Provides-Extra: api
37
+ Requires-Dist: anthropic>=1.15; extra == 'api'
38
+ Provides-Extra: dbos
39
+ Requires-Dist: dbos<4,>=3.3; extra == 'dbos'
40
+ Provides-Extra: dev
41
+ Requires-Dist: anthropic>=1.15; extra == 'dev'
42
+ Requires-Dist: dbos<4,>=3.3; extra == 'dev'
43
+ Requires-Dist: fastmcp<5,>=4.1.3; extra == 'dev'
44
+ Requires-Dist: google-api-python-client>=2.201.0; extra == 'dev'
45
+ Requires-Dist: google-auth-httplib2>=0.4.4; extra == 'dev'
46
+ Requires-Dist: google-auth>=2.62.0; extra == 'dev'
47
+ Requires-Dist: httplib2>=0.32.0; extra == 'dev'
48
+ Requires-Dist: mypy>=1.10; extra == 'dev'
49
+ Requires-Dist: openai>=2.45; extra == 'dev'
50
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
51
+ Requires-Dist: requests>=2.34.2; extra == 'dev'
52
+ Requires-Dist: ruff>=0.6; extra == 'dev'
53
+ Requires-Dist: temporalio>=1.7; extra == 'dev'
54
+ Requires-Dist: trustme>=1.2.1; extra == 'dev'
55
+ Requires-Dist: types-pyyaml; extra == 'dev'
56
+ Provides-Extra: mcp
57
+ Provides-Extra: openai-api
58
+ Requires-Dist: openai>=2.45; extra == 'openai-api'
59
+ Provides-Extra: serve
60
+ Requires-Dist: fastmcp<5,>=4.1.3; extra == 'serve'
61
+ Provides-Extra: temporal
62
+ Requires-Dist: temporalio>=1.7; extra == 'temporal'
63
+ Description-Content-Type: text/markdown
64
+
1
65
  # rote
2
66
 
3
67
  **Compile AI agent skills into cheap, fast, deterministic pipelines that
@@ -28,7 +92,8 @@ inside the package, so you can emit it and run it before you compile
28
92
  anything of your own:
29
93
 
30
94
  ```sh
31
- uv tool install 'rote-cli[dbos]' # or: python3 -m venv .venv && . .venv/bin/activate && pip install 'rote-cli[dbos]'
95
+ uv tool install rote-cli # or: python3 -m venv .venv && . .venv/bin/activate && pip install rote-cli
96
+ # (the first dbos run offers to add the dbos extra; you confirm it)
32
97
  rote example expense-audit # copies the skill, IR, code and sample input to ./expense-audit
33
98
  # (zero-install: uvx --from rote-cli rote example expense-audit)
34
99
 
@@ -51,12 +116,12 @@ rote run (python): succeeded
51
116
  "status": "draft",
52
117
  "reviewer": null,
53
118
  "reimbursable_usd": 2395.59,
54
- "pending_usd": 844.39,
55
- "returned_usd": 64.17,
119
+ "pending_usd": 18.75,
120
+ "returned_usd": 889.81,
56
121
  "batch_total_usd": 3304.15,
57
122
  "auto_approved": ["Dev Patel", "Emi Tanaka"],
58
- "review_items": 4,
59
- "blocked_items": 2
123
+ "review_items": 1,
124
+ "blocked_items": 5
60
125
  }
61
126
  }
62
127
  ```
@@ -71,7 +136,7 @@ runtime:
71
136
  rote emit expense-audit/expected/pipeline.yaml --runtime dbos --out expense-audit/app-dbos
72
137
  rote run expense-audit/app-dbos --input expense-audit/input.json \
73
138
  --signal controller_review='{"reviewer": "Priya Shah", "approved_ids": ["EXP-2403", "EXP-2413", "EXP-2420"], "rejected_ids": ["EXP-2410"]}'
74
- # ... "status": "final", "reimbursable_usd": 2990.98, "returned_usd": 313.17
139
+ # ... "status": "final", "reimbursable_usd": 2414.34, "returned_usd": 889.81
75
140
  ```
76
141
 
77
142
  What compiling it bought, measured: we ran the same batch twice each way
@@ -109,18 +174,49 @@ pip install rote-cli # or zero-install: uvx --from rote-cli rote ...
109
174
 
110
175
  # `rote compile` runs an LLM agent, so it needs a driver: Claude Code
111
176
  # (`claude`) or Codex (`codex`) installed and authed, or ANTHROPIC_API_KEY
112
- # for the in-process `api` driver. The BDR run below takes ~13 min and
113
- # ~$0.70 with Sonnet. (`rote emit` needs no LLM; see below.)
177
+ # for the in-process `api` driver. (`rote emit` needs no LLM; see below.)
178
+
179
+ # Default target is a compiled skill: the same skill name and trigger,
180
+ # with its fixed steps in code, run by the agent you already use:
181
+ rote compile ./examples/docs-digest/skill --out ./compiled/
182
+ # rote compile: ✓ docs-digest v...
183
+ # next: rote skill install .../compiled/runtime/skill/docs-digest
184
+ # then swap it in for the original docs-digest skill (Claude Code:
185
+ # ln -s .../runtime/skill/docs-digest ~/.claude/skills/docs-digest)
186
+ # or see it give the original's answer first: rote try ./examples/docs-digest/skill
187
+ ```
188
+
189
+ rote checks `~/.claude/skills/<name>` before it prints the link. When your
190
+ original skill is already there, `ln -s` would nest the link inside it
191
+ (and exit 0), so rote prints the swap with the original moved aside
192
+ instead, plus the undo. Nothing is deleted, and rote runs none of it:
114
193
 
115
- # Default target is DBOS: durable execution as a plain Python library,
116
- # no orchestrator to run, SQLite for dev / Postgres for prod:
117
- rote compile ./examples/bdr-outreach/skill --out ./compiled/
194
+ ```
195
+ then, for Claude Code: your original docs-digest skill is at ~/.claude/skills/docs-digest.
196
+ To use the compiled one instead, move the original out of the skills folder (nothing is
197
+ deleted): mv ~/.claude/skills/docs-digest ~/docs-digest.original && ln -s .../runtime/skill/docs-digest ~/.claude/skills/docs-digest
198
+ undo: rm ~/.claude/skills/docs-digest && mv ~/docs-digest.original ~/.claude/skills/docs-digest
199
+ ```
118
200
 
119
- # Or pick another runtime (see the table below):
120
- rote compile ./examples/bdr-outreach/skill --runtime temporal --out ./compiled/
201
+ ```sh
202
+ # Or emit a background workflow instead (see the table below):
203
+ rote compile ./examples/bdr-outreach/skill --runtime dbos --out ./compiled/
121
204
  rote compile ./examples/bdr-outreach/skill --runtime cloudflare --out ./compiled/
122
205
  ```
123
206
 
207
+ Measured on claude-sonnet-4-6, original skill against its compiled skill,
208
+ with every compared field matching within the original's own run-to-run
209
+ noise:
210
+
211
+ | Skill | Original | Compiled skill |
212
+ | --- | --- | --- |
213
+ | expense-audit | 154 s, $0.34 | 43 s, $0.13 |
214
+ | ops-report | 55 s, $0.13 | 42 s, $0.12 |
215
+ | docs-digest | 17.9 s, $0.093 | 16.3 s, $0.049 |
216
+
217
+ `rote try <skill>` runs that comparison on a skill of yours: it compiles,
218
+ installs, and runs both sides on the same input, after showing the cost.
219
+
124
220
  The name comes from *rote learning*: doing something so many times, so
125
221
  reliably, that it becomes mechanical. That's what compilation does to a
126
222
  skill.
@@ -181,13 +277,27 @@ and want to run a thousand more, unattended.
181
277
 
182
278
  ## How it works
183
279
 
184
- One `rote compile` run does the whole thing. An LLM agent (itself
185
- defined as a skill) reads the source skill, applies a structured
186
- compilation rubric, and emits a runtime-agnostic intermediate
187
- representation (`pipeline.yaml`), extracted Python modules for the
188
- deterministic parts, typed signature stubs for the LLM-judge parts, and
280
+ One `rote compile` run does the whole thing. First rote decides the
281
+ pipeline's structure: which nodes exist and of which kind, how they are
282
+ wired, which run once per item, which are mandatory, where a person must
283
+ approve, and which constants they carry (System-1, see
284
+ [`docs/design/system1-compile.md`](docs/design/system1-compile.md)). One
285
+ Claude Haiku call reads the whole skill and proposes that structure, and
286
+ rote checks every node against the skill's text, its tools' schemas and
287
+ the sample input before accepting it. `--structure rules` decides it with
288
+ rules over the skill's text instead, with no model call.
289
+ Then an LLM agent (itself defined as a skill) writes only the text those
290
+ decisions need: the extracted Python modules for the deterministic
291
+ parts, their tests, and the typed signatures and prompts for the
292
+ LLM-judge parts. rote holds the agent to its decisions, and emits a
293
+ runtime-agnostic intermediate representation (`pipeline.yaml`) plus
189
294
  runnable code for the durable execution engine of your choice.
190
295
 
296
+ `--no-system1` runs the original path instead, where the agent applies
297
+ the full compilation rubric and decides the structure too. `--update`
298
+ always uses that path, because System-1 does not support incremental
299
+ re-compilation yet.
300
+
191
301
  The agent implements the deterministic `pure_function` steps the skill
192
302
  spells out and writes tests for them. Before the compile reports
193
303
  success, rote checks what the agent wrote and runs those tests, and any
@@ -249,6 +359,12 @@ touching Python tooling:
249
359
  /plugin install rote@rote
250
360
  ```
251
361
 
362
+ New here? Run `/rote:setup`, or `uvx --from rote-cli rote setup` in a
363
+ terminal. It imports the MCP servers you already use, compiles one of your
364
+ skills, and shows that the compiled skill gives the same answer, with time
365
+ and cost on each side. It asks before every step and shows the cost before
366
+ anything is spent.
367
+
252
368
  Then say "compile this skill" (or run `/rote:compile`). It confirms the
253
369
  source directory, asks which runtime you want, runs the CLI via
254
370
  [uv](https://docs.astral.sh/uv/) in the background, and reports the
@@ -261,16 +377,17 @@ pipelines up as MCP tools so Claude can trigger the deployed workflows
261
377
  Prefer a terminal? The same thing is one `uvx` command:
262
378
 
263
379
  ```sh
264
- uvx --from rote-cli rote compile ./my-skill --runtime dbos --out ./compiled
380
+ uvx --from rote-cli rote compile ./my-skill --out ./compiled
265
381
  ```
266
382
 
267
383
  **Hosted platform:** [roteskills.com](https://roteskills.com) is the
268
384
  project site (concepts, benchmarks methodology, worked examples).
269
385
  [app.roteskills.com](https://app.roteskills.com) is Rote Cloud, a
270
386
  managed path for teams that would rather not operate a runtime: run
271
- `rote login` and `rote compile` then runs server-side, streams progress
272
- back, auto-deploys, and downloads the artifacts locally. Everything in
273
- this README still works logged out.
387
+ `rote login`, then `rote compile --cloud` (or set `deploy: rote-cloud`
388
+ with `rote init`) runs server-side, streams progress back, auto-deploys,
389
+ and downloads the artifacts locally. Everything in this README still
390
+ works logged out.
274
391
 
275
392
  > **Naming note:** the `rote` package on PyPI is an unrelated
276
393
  > memoization library that also installs `import rote`, so the two can't
@@ -363,30 +480,33 @@ through your API credentials.
363
480
  (over SSH, `--device` prints the code + URL instead), you click
364
481
  Approve, and the CLI stores a tenant API key at
365
482
  `~/.local/share/rote/cloud.json` (mode 0600). Once logged in,
366
- `rote compile` runs **on rote cloud by default**: the skill bundle
483
+ `rote compile --cloud` runs **on rote cloud**, and so does a compile
484
+ whose runtime is `cloudflare` or whose `deploy` is `rote-cloud`
485
+ (flag, env or config). A flagless compile stays local and emits a
486
+ compiled skill, logged in or not. On rote cloud the skill bundle
367
487
  syncs up (sha-diffed, so unchanged files don't re-upload), the
368
488
  platform runs the compilation server-side, live progress streams back
369
489
  through the same renderer as a local run, the result auto-deploys,
370
490
  and the artifacts download into your `--out` directory in the exact
371
- local layout. `--local` keeps the compilation on your machine (then
372
- the cloudflare-emit + auto-deploy flow applies), `--no-deploy` or a
373
- config opt-out (`runtime:` pinned to a local target, or
374
- `deploy: none`) keeps everything local; `--cloud` forces the server
375
- even where config says otherwise. Logged out, everything works
376
- locally exactly as before. `rote whoami` shows the account (verified
491
+ local layout. `--local` keeps the compilation on your machine (a
492
+ cloudflare compile then emits locally and auto-deploys), `--no-deploy`
493
+ or `deploy: none` keeps everything local; `--cloud` forces the server
494
+ even where config says otherwise. `rote whoami` shows the account (verified
377
495
  live); `rote logout` revokes the key server-side and clears the store.
378
- - **`rote init`**: one-time interactive onboarding: pick where
379
- compiled pipelines run (rote cloud, with login offered inline, or
380
- a local runtime, with a one-line pitch for each), which compiler
381
- driver does the work (availability probed live), and optionally a
382
- model. Answers are saved to `~/.config/rote/config.yaml`
496
+ - **`rote init`**: one-time onboarding: pick where compiled pipelines
497
+ run (locally, with `skill` first and recommended, or rote cloud, with
498
+ login offered), which
499
+ compiler driver and model do the work, and who decides a local
500
+ compile's structure. It shows what it will write and asks before
501
+ writing. Answers are saved to `~/.config/rote/config.yaml`
383
502
  (`--project` writes a `./rote.yaml` that overrides it per-repo) and
384
- every later command reads them. It's the only interactive command
385
- besides login; CI never hits a prompt.
503
+ every later command reads them. Every question has a flag, so CI and
504
+ agents run it with flags and `--yes`; it never prompts without a
505
+ person at a terminal.
386
506
  - **`rote config`**: print every configurable default with its
387
507
  effective value *and the layer that set it*. Resolution everywhere is
388
508
  `flag > ROTE_* env (ROTE_RUNTIME, ROTE_DEPLOY, ROTE_AGENT,
389
- ROTE_MODEL) > project rote.yaml > user config > built-in`. Config
509
+ ROTE_MODEL, ROTE_EFFORT) > project rote.yaml > user config > built-in`. Config
390
510
  files are strict: a typo'd key or value is a loud error, never a
391
511
  silent fallback. `--json` for automation.
392
512
  - **`rote eval <compiled>`**: render the before/after scorecard (wall
@@ -394,7 +514,11 @@ through your API credentials.
394
514
  much of the run is still LLM-decided). `rote compile` writes this to
395
515
  `compiled/scorecard.md` automatically. Add `--run` to *measure*
396
516
  instead of estimate: it executes both sides for real and appends
397
- measured cost, turns, and output agreement across trials.
517
+ measured cost, turns, and output agreement across trials. With
518
+ `--run --runtime skill` the after side is the compiled skill, run by
519
+ an agent through `rote skill run`, so both sides are agents and the
520
+ table compares context, tokens, time, cost and field fidelity
521
+ (`--budget` is required).
398
522
  - **Per-node inference**: emitted judges read `ROTE_MODEL_<ID>` and
399
523
  `ROTE_BASE_URL_<ID>` at runtime, so you can swap the model or point at
400
524
  any OpenAI-compatible endpoint (Ollama, vLLM, a gateway) without
@@ -427,13 +551,19 @@ way, prefer the more deterministic kind.
427
551
  Pick with `--runtime`; the same IR drives all of them. Under
428
552
  `--backend api`, none of the emitted code references MCP: the
429
553
  crystallization step replaces tool calls with direct vendor API calls.
554
+ The compiler agent gets web search and fetch tools for that, writes each
555
+ call from the vendor's current reference page, and cites the page as
556
+ `# docs: <url>`; `compile-report.md` lists every cited page beside
557
+ whether the agent fetched it during the compile. The api backend's calls
558
+ are Python, so it needs a Python runtime (`dbos`, `python`, `temporal`).
430
559
  Under the default `--backend mcp`, tool-using nodes emit a working MCP
431
560
  client call (with durable park-on-auth on every MCP-capable runtime);
432
561
  see [`docs/mcp-client.md`](docs/mcp-client.md).
433
562
 
434
563
  | Runtime | `--runtime` | Language | Shape | Notes |
435
564
  | --- | --- | --- | --- | --- |
436
- | **DBOS** (default) | `dbos` | Python | `main.py` with `@DBOS.workflow` + `@DBOS.step` per node | No orchestrator to deploy; SQLite (dev) / Postgres (prod) |
565
+ | **Compiled skill** (default) | `skill` | Python driver + SKILL.md | a skill dir: the original's name and description, `scripts/` runs the fixed steps, the agent answers only judges and gates | Install with `rote skill install`; runs in Claude Code, Codex and other skill clients through `rote skill run` |
566
+ | DBOS | `dbos` | Python | `main.py` with `@DBOS.workflow` + `@DBOS.step` per node | No orchestrator to deploy; SQLite (dev) / Postgres (prod) |
437
567
  | Temporal | `temporal` | Python | `workflow.py` + `activities.py` | Signal handlers for HITL gates |
438
568
  | Plain Python | `python` | Python | single `main.py` script | Max legibility, stdlib only; refuses HITL-gate pipelines |
439
569
  | Cloudflare Workflows | `cloudflare` | TypeScript | `WorkflowEntrypoint` + `wrangler.jsonc` | `wrangler deploy`-ready |