solwyn-cli 0.2.0rc1__tar.gz → 0.3.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 (574) hide show
  1. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/CONTRIBUTING.md +6 -0
  2. solwyn_cli-0.3.0/Makefile +8 -0
  3. solwyn_cli-0.3.0/PKG-INFO +168 -0
  4. solwyn_cli-0.3.0/README.md +149 -0
  5. solwyn_cli-0.3.0/docs/caller-owned-spend.md +176 -0
  6. solwyn_cli-0.3.0/docs/commands/README.md +36 -0
  7. solwyn_cli-0.3.0/docs/commands/account.mdx +59 -0
  8. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/commands/alerts.mdx +34 -1
  9. solwyn_cli-0.3.0/docs/commands/audit.mdx +45 -0
  10. solwyn_cli-0.3.0/docs/commands/budget.mdx +20 -0
  11. solwyn_cli-0.3.0/docs/commands/channels.mdx +177 -0
  12. solwyn_cli-0.3.0/docs/commands/config.mdx +89 -0
  13. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/commands/costs.mdx +37 -7
  14. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/commands/forecast.mdx +3 -3
  15. solwyn_cli-0.3.0/docs/commands/init.mdx +44 -0
  16. solwyn_cli-0.3.0/docs/commands/invite.mdx +58 -0
  17. solwyn_cli-0.3.0/docs/commands/keys.mdx +105 -0
  18. solwyn_cli-0.3.0/docs/commands/login.mdx +59 -0
  19. solwyn_cli-0.3.0/docs/commands/notifications.mdx +103 -0
  20. solwyn_cli-0.3.0/docs/commands/plan.mdx +110 -0
  21. solwyn_cli-0.3.0/docs/commands/projects.mdx +134 -0
  22. solwyn_cli-0.3.0/docs/commands/providers.mdx +76 -0
  23. solwyn_cli-0.3.0/docs/commands/runs.mdx +132 -0
  24. solwyn_cli-0.3.0/docs/commands/tags.mdx +112 -0
  25. solwyn_cli-0.3.0/docs/commands/team.mdx +59 -0
  26. solwyn_cli-0.3.0/docs/commands/webhooks.mdx +137 -0
  27. solwyn_cli-0.3.0/docs/commands/whoami.mdx +34 -0
  28. solwyn_cli-0.3.0/docs/core-followups.md +160 -0
  29. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/mcp-profiles.md +112 -7
  30. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/mcp-quickstart.md +40 -10
  31. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/mcp-release.md +14 -11
  32. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/registry/server.draft.json +2 -2
  33. solwyn_cli-0.3.0/docs/scripting.mdx +112 -0
  34. solwyn_cli-0.3.0/docs/staging-smoke.md +136 -0
  35. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/examples/mcp/python/client.py +53 -11
  36. solwyn_cli-0.3.0/examples/mcp/typescript/client.test.ts +158 -0
  37. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/examples/mcp/typescript/client.ts +31 -6
  38. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/pyproject.toml +1 -1
  39. solwyn_cli-0.3.0/scripts/budget-plane-cli-smoke.py +8 -0
  40. solwyn_cli-0.3.0/scripts/budget-plane-mcp-smoke.py +441 -0
  41. solwyn_cli-0.3.0/scripts/budget_plane_smoke.py +828 -0
  42. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/scripts/mcp_wheel_smoke.py +8 -2
  43. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/scripts/validate_mcp_registry.py +7 -2
  44. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/_mcp_doctor_ipc.py +5 -2
  45. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/_mcp_operation.py +1 -0
  46. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/_vendor/wire.py +3 -0
  47. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/auth.py +17 -0
  48. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/client.py +157 -22
  49. solwyn_cli-0.3.0/src/solwyn_cli/commands/_account_reads.py +52 -0
  50. solwyn_cli-0.3.0/src/solwyn_cli/commands/_alert_models.py +60 -0
  51. solwyn_cli-0.3.0/src/solwyn_cli/commands/_alert_reads.py +215 -0
  52. solwyn_cli-0.3.0/src/solwyn_cli/commands/_billing.py +103 -0
  53. solwyn_cli-0.3.0/src/solwyn_cli/commands/_confirmation.py +65 -0
  54. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/_cost_advice_models.py +2 -2
  55. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/_cost_filters.py +8 -0
  56. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/_cost_models.py +1 -1
  57. solwyn_cli-0.3.0/src/solwyn_cli/commands/_cost_reads.py +139 -0
  58. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/_entitlement.py +60 -6
  59. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/_notifications_common.py +1 -1
  60. solwyn_cli-0.3.0/src/solwyn_cli/commands/_pagination.py +44 -0
  61. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/_record.py +28 -6
  62. solwyn_cli-0.3.0/src/solwyn_cli/commands/_team.py +365 -0
  63. solwyn_cli-0.3.0/src/solwyn_cli/commands/account.py +246 -0
  64. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/alerts.py +140 -65
  65. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/attest.py +2 -1
  66. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/audit.py +48 -28
  67. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/budget.py +73 -9
  68. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/budget_rules.py +70 -6
  69. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/channels.py +23 -4
  70. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/cost_analysis.py +15 -12
  71. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/cost_pricing.py +14 -23
  72. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/costs.py +50 -11
  73. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/doctor.py +1 -1
  74. solwyn_cli-0.3.0/src/solwyn_cli/commands/invite.py +365 -0
  75. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/keys.py +38 -3
  76. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/login.py +7 -1
  77. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/mcp.py +1 -1
  78. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/notifications.py +1 -1
  79. solwyn_cli-0.3.0/src/solwyn_cli/commands/plan.py +764 -0
  80. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/providers.py +1 -0
  81. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/record.py +20 -3
  82. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/runs.py +39 -11
  83. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/tags.py +38 -9
  84. solwyn_cli-0.3.0/src/solwyn_cli/commands/team.py +365 -0
  85. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/webhooks.py +29 -6
  86. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/whoami.py +38 -22
  87. solwyn_cli-0.3.0/src/solwyn_cli/errors.py +322 -0
  88. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/main.py +6 -2
  89. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/mcp/parameters.py +43 -2
  90. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/mcp/server.py +878 -30
  91. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/spec/openapi_snapshot.json +1160 -299
  92. solwyn_cli-0.3.0/tests/contract/alert_read_query_parameters.json +88 -0
  93. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/contract/cli_contract.json +1523 -138
  94. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/fixtures/mcp_installed_legacy.py +47 -3
  95. solwyn_cli-0.3.0/tests/fixtures/team-prior-declarations.json +37 -0
  96. solwyn_cli-0.3.0/tests/golden/account-phone-json.json +1 -0
  97. solwyn_cli-0.3.0/tests/golden/account-recover.json +1 -0
  98. solwyn_cli-0.3.0/tests/golden/account-rename-table.txt +8 -0
  99. solwyn_cli-0.3.0/tests/golden/account-rename.json +1 -0
  100. solwyn_cli-0.3.0/tests/golden/alerts-activity-json.json +1 -0
  101. solwyn_cli-0.3.0/tests/golden/alerts-pending-json.json +1 -0
  102. solwyn_cli-0.3.0/tests/golden/budget-uncounted-json.json +1 -0
  103. solwyn_cli-0.3.0/tests/golden/costs-baseline-table.txt +2 -0
  104. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/doctor-jwt.json +1 -1
  105. solwyn_cli-0.3.0/tests/golden/doctor-mcp-key.json +1 -0
  106. solwyn_cli-0.3.0/tests/golden/invite-accept-table.txt +5 -0
  107. solwyn_cli-0.3.0/tests/golden/invite-accept.json +1 -0
  108. solwyn_cli-0.3.0/tests/golden/invite-show-table.txt +5 -0
  109. solwyn_cli-0.3.0/tests/golden/invite-show.json +1 -0
  110. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/mcp-tools.json +9406 -1151
  111. solwyn_cli-0.3.0/tests/golden/plan-cancel.json +1 -0
  112. solwyn_cli-0.3.0/tests/golden/plan-catalog-json.json +1 -0
  113. solwyn_cli-0.3.0/tests/golden/plan-discard.json +1 -0
  114. solwyn_cli-0.3.0/tests/golden/plan-free-table.txt +34 -0
  115. solwyn_cli-0.3.0/tests/golden/plan-pending-dismiss.json +1 -0
  116. solwyn_cli-0.3.0/tests/golden/plan-portal.json +1 -0
  117. solwyn_cli-0.3.0/tests/golden/plan-preview.json +1 -0
  118. solwyn_cli-0.3.0/tests/golden/plan-resume.json +1 -0
  119. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/plan-team-table.txt +5 -0
  120. solwyn_cli-0.3.0/tests/golden/plan-team.json +1 -0
  121. solwyn_cli-0.3.0/tests/golden/plan-upgrade.json +1 -0
  122. solwyn_cli-0.3.0/tests/golden/runs-stop-not-stoppable-json-stderr.txt +2 -0
  123. solwyn_cli-0.3.0/tests/golden/runs-stop-not-stoppable-table.txt +2 -0
  124. solwyn_cli-0.3.0/tests/golden/team-invite-resend-table.txt +7 -0
  125. solwyn_cli-0.3.0/tests/golden/team-invite-resend.json +1 -0
  126. solwyn_cli-0.3.0/tests/golden/team-invite-revoke-table.txt +6 -0
  127. solwyn_cli-0.3.0/tests/golden/team-invite-revoke.json +1 -0
  128. solwyn_cli-0.3.0/tests/golden/team-invite-send-table.txt +8 -0
  129. solwyn_cli-0.3.0/tests/golden/team-invite-send.json +1 -0
  130. solwyn_cli-0.3.0/tests/golden/team-invites-table.txt +3 -0
  131. solwyn_cli-0.3.0/tests/golden/team-invites.json +1 -0
  132. solwyn_cli-0.3.0/tests/golden/team-leave-table.txt +7 -0
  133. solwyn_cli-0.3.0/tests/golden/team-leave.json +1 -0
  134. solwyn_cli-0.3.0/tests/golden/team-members-table.txt +2 -0
  135. solwyn_cli-0.3.0/tests/golden/team-members.json +1 -0
  136. solwyn_cli-0.3.0/tests/golden/team-remove-table.txt +6 -0
  137. solwyn_cli-0.3.0/tests/golden/team-remove.json +1 -0
  138. solwyn_cli-0.3.0/tests/golden/team-role-table.txt +6 -0
  139. solwyn_cli-0.3.0/tests/golden/team-role.json +1 -0
  140. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/whoami-jwt-table.txt +1 -0
  141. solwyn_cli-0.3.0/tests/golden/whoami-jwt.json +1 -0
  142. solwyn_cli-0.3.0/tests/golden/whoami-production-json.json +1 -0
  143. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/whoami-production-table.txt +1 -0
  144. solwyn_cli-0.3.0/tests/help_options.py +21 -0
  145. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/mcp_legacy_probe.py +52 -3
  146. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_alert_query_contract.py +54 -0
  147. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_attest_contract.py +42 -0
  148. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_attribution_commands.py +8 -4
  149. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_audit_command.py +17 -2
  150. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_auth_commands.py +11 -0
  151. solwyn_cli-0.3.0/tests/test_billing_errors_preview.py +520 -0
  152. solwyn_cli-0.3.0/tests/test_billing_lifecycle.py +414 -0
  153. solwyn_cli-0.3.0/tests/test_billing_status_contract.py +75 -0
  154. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_budget_batch.py +39 -4
  155. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_budget_check_command.py +6 -0
  156. solwyn_cli-0.3.0/tests/test_budget_cli_smoke.py +296 -0
  157. solwyn_cli-0.3.0/tests/test_budget_mcp_smoke.py +109 -0
  158. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_ci_packaging_smoke.py +1 -1
  159. solwyn_cli-0.3.0/tests/test_cli_all_pages.py +295 -0
  160. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_client.py +3 -3
  161. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_cost_stream.py +33 -2
  162. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_costs_command.py +4 -0
  163. solwyn_cli-0.3.0/tests/test_destructive_confirmation.py +439 -0
  164. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_doctor_command.py +41 -0
  165. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_help_snapshots.py +209 -15
  166. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_keys_command.py +45 -27
  167. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_adoption.py +115 -0
  168. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_boundary.py +2 -2
  169. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_bounded_results.py +67 -7
  170. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_cancellation_stdio.py +1 -1
  171. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_catalog.py +104 -19
  172. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_conformance.py +106 -7
  173. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_diagnostics.py +1 -1
  174. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_doctor_process.py +1 -1
  175. solwyn_cli-0.3.0/tests/test_mcp_local_read_guidance.py +113 -0
  176. solwyn_cli-0.3.0/tests/test_mcp_read_gaps.py +858 -0
  177. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_registry.py +46 -1
  178. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_server.py +20 -0
  179. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_wheel_runner.py +16 -3
  180. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_notifications_commands.py +12 -5
  181. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_notifications_review_regressions.py +6 -6
  182. solwyn_cli-0.3.0/tests/test_plan_command.py +411 -0
  183. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_providers_command.py +2 -1
  184. solwyn_cli-0.3.0/tests/test_read_gaps.py +596 -0
  185. solwyn_cli-0.3.0/tests/test_reliability.py +693 -0
  186. solwyn_cli-0.3.0/tests/test_reliability_review.py +244 -0
  187. solwyn_cli-0.3.0/tests/test_reliability_round2.py +450 -0
  188. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_request_drift.py +74 -0
  189. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_response_subset.py +162 -5
  190. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_run_attribution_integration.py +18 -6
  191. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_runs_command.py +11 -3
  192. solwyn_cli-0.3.0/tests/test_simulation_rejections.py +178 -0
  193. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_smoke.py +1 -1
  194. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_tags_commands.py +4 -2
  195. solwyn_cli-0.3.0/tests/test_team_account.py +1302 -0
  196. solwyn_cli-0.3.0/tests/test_team_mcp.py +173 -0
  197. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_vendor_wire.py +20 -0
  198. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_webhooks_command.py +41 -24
  199. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/uv.lock +6 -6
  200. solwyn_cli-0.2.0rc1/PKG-INFO +0 -287
  201. solwyn_cli-0.2.0rc1/README.md +0 -268
  202. solwyn_cli-0.2.0rc1/docs/core-followups.md +0 -120
  203. solwyn_cli-0.2.0rc1/docs/scripting.mdx +0 -24
  204. solwyn_cli-0.2.0rc1/examples/mcp/typescript/client.test.ts +0 -72
  205. solwyn_cli-0.2.0rc1/src/solwyn_cli/commands/account.py +0 -55
  206. solwyn_cli-0.2.0rc1/src/solwyn_cli/commands/plan.py +0 -162
  207. solwyn_cli-0.2.0rc1/src/solwyn_cli/errors.py +0 -151
  208. solwyn_cli-0.2.0rc1/tests/golden/costs-baseline-table.txt +0 -2
  209. solwyn_cli-0.2.0rc1/tests/golden/doctor-mcp-key.json +0 -1
  210. solwyn_cli-0.2.0rc1/tests/golden/plan-team.json +0 -1
  211. solwyn_cli-0.2.0rc1/tests/golden/runs-stop-not-stoppable-table.txt +0 -1
  212. solwyn_cli-0.2.0rc1/tests/golden/whoami-jwt.json +0 -1
  213. solwyn_cli-0.2.0rc1/tests/golden/whoami-production-json.json +0 -1
  214. solwyn_cli-0.2.0rc1/tests/test_plan_command.py +0 -192
  215. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  216. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  217. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/.github/workflows/ci.yml +0 -0
  218. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/.github/workflows/publish.yml +0 -0
  219. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/.gitignore +0 -0
  220. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/LICENSE +0 -0
  221. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/SECURITY.md +0 -0
  222. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/commands/attest.mdx +0 -0
  223. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/commands/overview.mdx +0 -0
  224. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/commands/status.mdx +0 -0
  225. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/mcp-bounded-work.md +0 -0
  226. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/mcp-diagnostics.md +0 -0
  227. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/media-confirmation.md +0 -0
  228. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/registry/server.schema.2025-12-11.json +0 -0
  229. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/docs/registry/server.schema.2025-12-11.sha256 +0 -0
  230. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/examples/mcp/python/pyproject.toml +0 -0
  231. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/examples/mcp/python/uv.lock +0 -0
  232. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/examples/mcp/typescript/.gitignore +0 -0
  233. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/examples/mcp/typescript/package-lock.json +0 -0
  234. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/examples/mcp/typescript/package.json +0 -0
  235. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/examples/mcp/typescript/tsconfig.json +0 -0
  236. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/scripts/generate_contract.py +0 -0
  237. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/scripts/inspect_wheel.py +0 -0
  238. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/scripts/locks/mcp-legacy.in +0 -0
  239. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/scripts/locks/mcp-legacy.txt +0 -0
  240. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/scripts/sync_spec.py +0 -0
  241. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/__init__.py +0 -0
  242. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/_mcp_doctor_helper.py +0 -0
  243. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/_mcp_doctor_pipe.py +0 -0
  244. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/_mcp_doctor_process.py +0 -0
  245. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/_mcp_launch.py +0 -0
  246. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/_vendor/__init__.py +0 -0
  247. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/_vendor/batch.py +0 -0
  248. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/_vendor/notification_wire.py +0 -0
  249. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/_vendor/validation.py +0 -0
  250. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/artifacts/__init__.py +0 -0
  251. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/artifacts/_atomic.py +0 -0
  252. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/__init__.py +0 -0
  253. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/_shared.py +0 -0
  254. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/_tags.py +0 -0
  255. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/agent_context.py +0 -0
  256. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/config.py +0 -0
  257. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/forecast.py +0 -0
  258. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/init.py +0 -0
  259. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/mcp_config.py +0 -0
  260. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/mcp_doctor.py +0 -0
  261. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/overview.py +0 -0
  262. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/projects.py +0 -0
  263. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/commands/status.py +0 -0
  264. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/config.py +0 -0
  265. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/exit_codes.py +0 -0
  266. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/help.py +0 -0
  267. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/mcp/__init__.py +0 -0
  268. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/mcp/declarations.py +0 -0
  269. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/output.py +0 -0
  270. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/runtime.py +0 -0
  271. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/src/solwyn_cli/spec/__init__.py +0 -0
  272. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/contract/__init__.py +0 -0
  273. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/contract/account_cost_query_parameters.json +0 -0
  274. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/contract/alert_query_parameters.json +0 -0
  275. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/contract/builder.py +0 -0
  276. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/contract/cost_query_parameters.json +0 -0
  277. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/fixtures/mcp_doctor_server.py +0 -0
  278. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/fixtures/mcp_doctor_telemetry.py +0 -0
  279. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/fixtures/mcp_doctor_wheel_smoke.py +0 -0
  280. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/__init__.py +0 -0
  281. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/account-alert-email-clear-json.json +0 -0
  282. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/account-alert-email-clear-table.txt +0 -0
  283. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/account-alert-email-set-json.json +0 -0
  284. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/account-alert-email-set-table.txt +0 -0
  285. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/account-alert-email-show-json.json +0 -0
  286. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/account-alert-email-show-table.txt +0 -0
  287. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/agent-context.txt +0 -0
  288. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-account-delete-json.json +0 -0
  289. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-account-delete-table.txt +0 -0
  290. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-account-preview-json.json +0 -0
  291. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-account-preview-table.txt +0 -0
  292. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-account-set-json.json +0 -0
  293. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-account-set-table.txt +0 -0
  294. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-account-show-json.json +0 -0
  295. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-account-show-table.txt +0 -0
  296. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-account-snooze-json.json +0 -0
  297. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-account-snooze-table.txt +0 -0
  298. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-account-unsnooze-json.json +0 -0
  299. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-account-unsnooze-table.txt +0 -0
  300. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-list-json.json +0 -0
  301. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-list-table.txt +0 -0
  302. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-show-json.json +0 -0
  303. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/alerts-show-table.txt +0 -0
  304. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/attest-account-csv.txt +0 -0
  305. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/attest-project-json.json +0 -0
  306. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/audit-json.json +0 -0
  307. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/audit-table.txt +0 -0
  308. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-allow-json.json +0 -0
  309. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-allow-table.txt +0 -0
  310. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-batch-allowed.json +0 -0
  311. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-batch-allowed.table +0 -0
  312. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-batch-denied.json +0 -0
  313. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-batch-denied.table +0 -0
  314. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-batch-mixed.json +0 -0
  315. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-batch-mixed.table +0 -0
  316. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-batch-partial.json +0 -0
  317. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-batch-partial.table +0 -0
  318. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-batch-stopped.json +0 -0
  319. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-batch-stopped.table +0 -0
  320. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-batch-unknown.json +0 -0
  321. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-batch-unknown.table +0 -0
  322. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-deny-json.json +0 -0
  323. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-deny-table.txt +0 -0
  324. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-fail-open-json.json +0 -0
  325. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-fail-open-table.txt +0 -0
  326. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-read-only-key-json.json +0 -0
  327. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-read-only-key-table.txt +0 -0
  328. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-run-stopped-json.json +0 -0
  329. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-run-stopped-table.txt +0 -0
  330. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-tag-deny-json.json +0 -0
  331. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-check-tag-deny-table.txt +0 -0
  332. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-confirm-expired-json.json +0 -0
  333. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-confirm-expired-table.txt +0 -0
  334. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-confirm-missing-reservation-json.json +0 -0
  335. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-confirm-missing-reservation-table.txt +0 -0
  336. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-confirm-success-json.json +0 -0
  337. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-confirm-success-table.txt +0 -0
  338. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-restore-defaults-json.json +0 -0
  339. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-restore-defaults-table.txt +0 -0
  340. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-add-budget_threshold-json.json +0 -0
  341. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-add-budget_threshold-table.txt +0 -0
  342. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-add-daily_anomaly-json.json +0 -0
  343. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-add-daily_anomaly-table.txt +0 -0
  344. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-add-forecast_overrun-json.json +0 -0
  345. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-add-forecast_overrun-table.txt +0 -0
  346. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-add-runaway_run-json.json +0 -0
  347. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-add-runaway_run-table.txt +0 -0
  348. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-add-scoped_budget-json.json +0 -0
  349. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-add-scoped_budget-table.txt +0 -0
  350. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-add-unit_cost_anomaly-json.json +0 -0
  351. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-add-unit_cost_anomaly-table.txt +0 -0
  352. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-pause-json.json +0 -0
  353. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-pause-table.txt +0 -0
  354. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-preview-json.json +0 -0
  355. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-preview-table.txt +0 -0
  356. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-remove-json.json +0 -0
  357. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-remove-table.txt +0 -0
  358. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-resume-json.json +0 -0
  359. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-resume-table.txt +0 -0
  360. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-snooze-json.json +0 -0
  361. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-snooze-table.txt +0 -0
  362. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-unsnooze-json.json +0 -0
  363. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rule-unsnooze-table.txt +0 -0
  364. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rules-list-json.json +0 -0
  365. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-rules-list-table.txt +0 -0
  366. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-set-json.json +0 -0
  367. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-set-table.txt +0 -0
  368. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-status-json.json +0 -0
  369. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-status-rules-json.json +0 -0
  370. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-status-rules-table.txt +0 -0
  371. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-status-table.txt +0 -0
  372. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-threshold-snooze-json.json +0 -0
  373. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-threshold-snooze-table.txt +0 -0
  374. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-threshold-unsnooze-json.json +0 -0
  375. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/budget-threshold-unsnooze-table.txt +0 -0
  376. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/channels-create-json.json +0 -0
  377. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/channels-create-table.txt +0 -0
  378. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/channels-delete-json.json +0 -0
  379. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/channels-delete-table.txt +0 -0
  380. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/channels-list-json.json +0 -0
  381. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/channels-list-table.txt +0 -0
  382. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/channels-show-json.json +0 -0
  383. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/channels-show-table.txt +0 -0
  384. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/channels-test-json.json +0 -0
  385. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/channels-test-table.txt +0 -0
  386. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/channels-update-json.json +0 -0
  387. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/channels-update-table.txt +0 -0
  388. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-account-json.json +0 -0
  389. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-account-table.txt +0 -0
  390. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-account-withheld-json.json +0 -0
  391. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-account-withheld-table.txt +0 -0
  392. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-agent_run-json.json +0 -0
  393. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-agent_run-table.txt +0 -0
  394. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-baseline-json.json +0 -0
  395. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-day-json.json +0 -0
  396. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-day-table.txt +0 -0
  397. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-drift-json.json +0 -0
  398. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-drift-table.txt +0 -0
  399. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-events-continuation-stderr.txt +0 -0
  400. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-events-json.json +0 -0
  401. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-events-table.txt +0 -0
  402. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-failover_reason-json.json +0 -0
  403. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-failover_reason-table.txt +0 -0
  404. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-model-json.json +0 -0
  405. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-model-table.txt +0 -0
  406. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-priced-models-json.json +0 -0
  407. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-priced-models-table.txt +0 -0
  408. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-provider-json.json +0 -0
  409. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-provider-table.txt +0 -0
  410. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-provider_region-json.json +0 -0
  411. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-provider_region-table.txt +0 -0
  412. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-service_tier-json.json +0 -0
  413. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-service_tier-table.txt +0 -0
  414. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-simulation-json.json +0 -0
  415. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-simulation-table.txt +0 -0
  416. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-status-json.json +0 -0
  417. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-status-table.txt +0 -0
  418. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-tag-customer-json.json +0 -0
  419. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-tag-customer-table.txt +0 -0
  420. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-total-json.json +0 -0
  421. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-total-table.txt +0 -0
  422. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-truncated-json.json +0 -0
  423. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-truncated-table.txt +0 -0
  424. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-unit-economics-json.json +0 -0
  425. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/costs-unit-economics-table.txt +0 -0
  426. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/doctor-degraded-table.txt +0 -0
  427. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/email-not-verified.json +0 -0
  428. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/error.json +0 -0
  429. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/forecast-table.txt +0 -0
  430. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/forecast.json +0 -0
  431. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/harness.py +0 -0
  432. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/human-error.txt +0 -0
  433. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/init-json.json +0 -0
  434. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/init-table.txt +0 -0
  435. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/keys-environment-key-refusal-json.json +0 -0
  436. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/keys-environment-key-refusal-table.txt +0 -0
  437. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/keys-keyring-key-refusal-json.json +0 -0
  438. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/keys-keyring-key-refusal-table.txt +0 -0
  439. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/keys-not-found-json.json +0 -0
  440. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/keys-not-found-table.txt +0 -0
  441. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/keys-revoke-json.json +0 -0
  442. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/keys-revoke-table.txt +0 -0
  443. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/keys-rotate-json.json +0 -0
  444. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/keys-rotate-table.txt +0 -0
  445. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/keys-show-json.json +0 -0
  446. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/keys-show-table.txt +0 -0
  447. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/login-jwt-table.txt +0 -0
  448. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/login-jwt.json +0 -0
  449. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/login-key-table.txt +0 -0
  450. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/login-key.json +0 -0
  451. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/logout-table.txt +0 -0
  452. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/logout.json +0 -0
  453. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/mcp-config.json +0 -0
  454. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/notifications-set-json.json +0 -0
  455. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/notifications-set-table.txt +0 -0
  456. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/notifications-show-json.json +0 -0
  457. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/notifications-show-table.txt +0 -0
  458. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/notifications-test-json.json +0 -0
  459. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/notifications-test-table.txt +0 -0
  460. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/overview-json.json +0 -0
  461. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/overview-paid-json.json +0 -0
  462. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/overview-table.txt +0 -0
  463. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-create-display-json.json +0 -0
  464. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-create-display-table.txt +0 -0
  465. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-create-stored-json.json +0 -0
  466. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-create-stored-table.txt +0 -0
  467. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-delete-json.json +0 -0
  468. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-delete-table.txt +0 -0
  469. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-list-environment-key-refusal-json.json +0 -0
  470. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-list-environment-key-refusal-table.txt +0 -0
  471. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-list-jwt-json.json +0 -0
  472. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-list-jwt-table.txt +0 -0
  473. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-list-keyring-key-refusal-json.json +0 -0
  474. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-list-keyring-key-refusal-table.txt +0 -0
  475. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-rename-json.json +0 -0
  476. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-rename-table.txt +0 -0
  477. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-show-jwt-json.json +0 -0
  478. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-show-jwt-table.txt +0 -0
  479. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-show-key-json.json +0 -0
  480. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/projects-show-key-table.txt +0 -0
  481. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/providers-failovers-table.txt +0 -0
  482. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/providers-failovers.json +0 -0
  483. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/providers-untracked-table.txt +0 -0
  484. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/providers-untracked.json +0 -0
  485. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/record-batch-json.json +0 -0
  486. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/record-batch-table.txt +0 -0
  487. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/record-dedup-json.json +0 -0
  488. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/record-dedup-table.txt +0 -0
  489. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/record-legacy-json.json +0 -0
  490. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/record-legacy-table.txt +0 -0
  491. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/record-rejection-json.json +0 -0
  492. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/record-rejection-table.txt +0 -0
  493. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/record-single-json.json +0 -0
  494. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/record-single-table.txt +0 -0
  495. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/runs-list-jwt-json.json +0 -0
  496. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/runs-list-key-table.txt +0 -0
  497. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/runs-show-json.json +0 -0
  498. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/runs-show-table.txt +0 -0
  499. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/runs-stop-json.json +0 -0
  500. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/runs-stop-key-refusal-json.json +0 -0
  501. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/runs-stop-key-refusal-table.txt +0 -0
  502. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/runs-stop-not-stoppable-json.json +0 -0
  503. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/runs-stop-table.txt +0 -0
  504. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/status-flags-table.txt +0 -0
  505. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/status-flags.json +0 -0
  506. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/status-jwt-savings-json.json +0 -0
  507. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/status-jwt-savings-table.txt +0 -0
  508. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/status-table.txt +0 -0
  509. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/status.json +0 -0
  510. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/success.json +0 -0
  511. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/table-no-color.txt +0 -0
  512. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/table-non-tty.txt +0 -0
  513. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/table-tty.txt +0 -0
  514. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/tags-list-json.json +0 -0
  515. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/tags-list-table.txt +0 -0
  516. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/tags-retire-json.json +0 -0
  517. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/tags-retire-table.txt +0 -0
  518. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/tags-values-json.json +0 -0
  519. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/tags-values-table.txt +0 -0
  520. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/webhooks-create-json.json +0 -0
  521. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/webhooks-create-table.txt +0 -0
  522. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/webhooks-delete-json.json +0 -0
  523. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/webhooks-delete-table.txt +0 -0
  524. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/webhooks-list-json.json +0 -0
  525. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/webhooks-list-table.txt +0 -0
  526. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/webhooks-rotate-json.json +0 -0
  527. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/webhooks-rotate-table.txt +0 -0
  528. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/whoami-key-table.txt +0 -0
  529. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/golden/whoami-key.json +0 -0
  530. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/mcp_batch_fixtures.py +0 -0
  531. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_agent_artifacts.py +0 -0
  532. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_alerts_command.py +0 -0
  533. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_atomic_rename.py +0 -0
  534. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_attest_command.py +0 -0
  535. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_attest_models.py +0 -0
  536. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_auth.py +0 -0
  537. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_batch_journal_contract.py +0 -0
  538. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_budget_command.py +0 -0
  539. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_budget_confirm_command.py +0 -0
  540. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_budget_rules_command.py +0 -0
  541. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_budget_set_command.py +0 -0
  542. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_config.py +0 -0
  543. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_config_command.py +0 -0
  544. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_contract_snapshot.py +0 -0
  545. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_cost_advice_command.py +0 -0
  546. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_cost_advice_contract.py +0 -0
  547. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_cost_advice_registration.py +0 -0
  548. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_cost_filters.py +0 -0
  549. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_cost_query_contract.py +0 -0
  550. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_entitlement.py +0 -0
  551. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_errors.py +0 -0
  552. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_exit_codes.py +0 -0
  553. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_forecast_command.py +0 -0
  554. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_foundation.py +0 -0
  555. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_init_command.py +0 -0
  556. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_batch_recovery.py +0 -0
  557. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_doctor_pipe.py +0 -0
  558. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_operation.py +0 -0
  559. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_pagination.py +0 -0
  560. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_protocol_privacy.py +0 -0
  561. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_sdk_migration.py +0 -0
  562. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_mcp_transport_lifecycle.py +0 -0
  563. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_media_confirmation.py +0 -0
  564. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_output.py +0 -0
  565. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_output_discipline.py +0 -0
  566. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_overview_command.py +0 -0
  567. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_projects_command.py +0 -0
  568. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_record_helpers.py +0 -0
  569. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_runtime.py +0 -0
  570. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_shared_command_auth.py +0 -0
  571. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_snapshot_age.py +0 -0
  572. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_status_command.py +0 -0
  573. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_vendor_sync.py +0 -0
  574. {solwyn_cli-0.2.0rc1 → solwyn_cli-0.3.0}/tests/test_vendor_validation.py +0 -0
@@ -10,6 +10,12 @@ uv run ruff format --check .
10
10
  uv run pytest
11
11
  ```
12
12
 
13
+ For deployed API validation, export a staging account JWT as `SOLWYN_JWT` and run
14
+ `make smoke-cli` or `make smoke-mcp`. Each command creates a disposable project,
15
+ records synthetic durable spend, tests budget enforcement and reporting, and
16
+ archives the project afterward. See [staging smoke tests](docs/staging-smoke.md)
17
+ for prerequisites, coverage, and dashboard inspection options.
18
+
13
19
  ## Command and output contracts
14
20
 
15
21
  Treat command names, flags, help text, exit codes, stdout/stderr behavior, and JSON schemas as
@@ -0,0 +1,8 @@
1
+ .PHONY: smoke-cli smoke-mcp
2
+
3
+ # Creates synthetic durable spend in a disposable staging project; requires SOLWYN_JWT.
4
+ smoke-cli:
5
+ @uv run --locked python scripts/budget-plane-cli-smoke.py $(SMOKE_ARGS)
6
+
7
+ smoke-mcp:
8
+ @uv run --locked python scripts/budget-plane-mcp-smoke.py $(SMOKE_ARGS)
@@ -0,0 +1,168 @@
1
+ Metadata-Version: 2.5
2
+ Name: solwyn-cli
3
+ Version: 0.3.0
4
+ Summary: Command-line client for Solwyn
5
+ Author-email: Solwyn <hello@solwyn.ai>
6
+ License-Expression: Apache-2.0
7
+ License-File: LICENSE
8
+ Requires-Python: >=3.11
9
+ Requires-Dist: click>=8.1
10
+ Requires-Dist: httpx>=0.27
11
+ Requires-Dist: keyring>=25
12
+ Requires-Dist: mcp==2.1.1
13
+ Requires-Dist: platformdirs>=4
14
+ Requires-Dist: pydantic>=2
15
+ Requires-Dist: rich>=13
16
+ Requires-Dist: tomli-w>=1
17
+ Requires-Dist: typer>=0.12
18
+ Description-Content-Type: text/markdown
19
+
20
+ # Solwyn CLI
21
+
22
+ Work with Solwyn from the command line: enforce and attribute LLM spend for calls the Solwyn SDK does not instrument, inspect budgets, costs, and provider health, and recover from leaked or expired project keys — from your terminal, your scripts, or your coding agent.
23
+
24
+ This README describes solwyn-cli 0.3.0. The package is distributed on PyPI as `solwyn-cli`;
25
+ run `solwyn --version` to see which version you have installed, and use `solwyn --help`
26
+ and MCP discovery to inspect its exact surface.
27
+
28
+ ## Installation
29
+
30
+ Install the published package with uv:
31
+
32
+ ```console
33
+ uv tool install solwyn-cli
34
+ solwyn --version
35
+ ```
36
+
37
+ Or use `pipx install solwyn-cli`. For development or unreleased commands, install
38
+ from an authorized checkout with `uv tool install .`.
39
+
40
+ Requires Python 3.11 or newer. The package installs two identical executables: `solwyn` and `solwyn-cli` (an alias matching the package name).
41
+
42
+ ## Getting started
43
+
44
+ ```console
45
+ solwyn login # authenticate; use --with-key to store a project key instead
46
+ solwyn init # configure Solwyn for the current repository
47
+ solwyn status # project budget and provider health at a glance
48
+ ```
49
+
50
+ `solwyn init` authenticates, selects a project, writes local configuration, detects the provider SDKs your code imports, prints the wiring for each, and verifies your budget end-to-end. Add `--agents` to also write guidance files for Claude, Cursor, and `AGENTS.md`.
51
+
52
+ ## Three ways to use it
53
+
54
+ Calls made through the Solwyn Python SDK are enforced and attributed automatically. The CLI covers the three cases the SDK cannot reach.
55
+
56
+ ### Give a coding agent a budget
57
+
58
+ `solwyn mcp` serves read, guardrail, and attribution tools to any MCP client over local stdio, resolving configuration and credentials fresh on every call. Standard MCP capability and schema discovery exposes the exact tools and input/output shapes in the running version. `solwyn agent-context` prints a compact SDK 0.6 capability contract suitable for pasting into an agent's context, and `solwyn init --agents` writes the equivalent guidance into the repository.
59
+
60
+ ```console
61
+ solwyn --project proj_0123456789abcdef01234567 mcp --profile read # 33 read tools
62
+ solwyn --project proj_0123456789abcdef01234567 mcp # default guardrails profile, all 37 tools
63
+ solwyn doctor --mcp # verify the wiring
64
+ ```
65
+
66
+ Customer reads include account-wide alert activity and open deliveries, last firing,
67
+ advisory unpriced outage traffic, plan catalog/status/change preview, identity/email verification,
68
+ phone/SMS prerequisites, team roster/invitations, cost analysis/simulation, provider visibility and audit.
69
+ The 33 reads appear in both profiles; billing/team/member writes remain CLI-only.
70
+ See [alerts](docs/commands/alerts.mdx), [budget](docs/commands/budget.mdx),
71
+ [plan](docs/commands/plan.mdx), [account](docs/commands/account.mdx),
72
+ [team](docs/commands/team.mdx) and [invitation acceptance](docs/commands/invite.mdx).
73
+
74
+ Start with the [MCP quickstart](docs/mcp-quickstart.md). Profiles are fixed at launch and never grant permissions; see [MCP profiles and tool contracts](docs/mcp-profiles.md) and the [agent integration guide](https://docs.solwyn.ai/docs/cli/agents).
75
+
76
+ ### Gate CI on budget
77
+
78
+ One pipeline step, one exit code, no code change. `budget status` is a pure read, so a read-only key is enough.
79
+
80
+ ```console
81
+ # Exit 4 when the project is at or over 80% of its monthly budget.
82
+ solwyn --json budget status --max-utilization 80
83
+ ```
84
+
85
+ See [Gate CI on budget](https://docs.solwyn.ai/docs/cli/ci-budget-gate).
86
+
87
+ ### Meter a call the SDK does not wrap
88
+
89
+ For a `curl`, another language, or a one-off script, reserve budget before the call and settle it after. A denied check exits with code 4, so scripts stop before they spend.
90
+
91
+ ```console
92
+ # 1. Reserve immediately before the call.
93
+ solwyn budget check --provider openai --model gpt-4.1 --estimated-input-tokens 1200
94
+
95
+ # 2. Make the provider call yourself.
96
+
97
+ # 3. Settle with what the call actually used. This also records attribution.
98
+ solwyn budget confirm --call-id 12345678-1234-1234-1234-123456789abc --provider openai --model gpt-4.1 \
99
+ --reservation-id "$RESERVATION" --input-tokens 1180 --output-tokens 640
100
+ ```
101
+
102
+ The CLI's caller-owned workflow maintains parity with Solwyn Python SDK 0.6.0 semantics and covers enforcement and attribution. Use `record` for a completed call that had no reservation, such as a local model. The same loop prices image, video, audio, and speech calls by their billed units, declares fallback intent, scopes enforcement to a single agent run, and reserves for a batch of calls at once; see [Meter un-instrumented calls](https://docs.solwyn.ai/docs/cli/metering-uninstrumented-calls) for the walkthrough and [caller-owned spend reference](docs/caller-owned-spend.md) for the full rules.
103
+
104
+ ## Commands
105
+
106
+ Every command's `--help` states its exit codes, authentication requirements, and JSON output schema.
107
+
108
+ | Group | Commands |
109
+ | --- | --- |
110
+ | Setup and identity | `init`, `login`, `logout`, `whoami`, `doctor` |
111
+ | Monitoring | `status`, `costs`, `forecast`, `overview`, `providers` |
112
+ | Budget guardrails | `budget status` / `check` / `confirm` / `set`, `record`, `runs` |
113
+ | Agents | `mcp`, `mcp-config`, `agent-context` |
114
+ | Administration | `budget rules` / `rule` / `threshold`, `alerts`, `channels`, `notifications`, `webhooks`, `keys`, `projects`, `account`, `tags`, `audit`, `attest`, `plan`, `config` |
115
+
116
+ Account management includes subscription preview, change, cancellation/resume,
117
+ scheduled-change discard, hosted checkout/portal links and pending-intent dismissal.
118
+ Billing writes require owner JWT and confirmation or `--yes`; preview is a JWT
119
+ read at any role. See the [plan reference](docs/commands/plan.mdx). The [in-repo command reference](docs/commands/README.md) describes this checkout.
120
+ The published guide lives in the [CLI docs](https://docs.solwyn.ai/docs/cli).
121
+
122
+ ## Scripting
123
+
124
+ API and setup commands support global `--json` for schema-bearing JSON output (each payload names its schema, e.g. `solwyn.costs.v1`), and exit codes are stable and documented per command: `0` success, `2` usage, with distinct codes for API, auth, budget-denial, and not-found failures. The local `config` commands emit plain text. Global flags select the project (`--project`), API base URL (`--api-url`), and output format, and go before the subcommand.
125
+
126
+ ## Trust posture
127
+
128
+ Solwyn CLI:
129
+
130
+ - sends only your own spend events; `sdk_instance_id` is an invocation ID (the retained operation UUID for recoverable MCP batches); no telemetry;
131
+ - never captures, logs, or transmits prompts or responses;
132
+ - never collects, stores, or proxies provider API keys;
133
+ - has no telemetry, update checks, or phone-home behavior; and
134
+ - stores Solwyn credentials only in the operating system keychain, never in configuration files, command-line arguments, or output.
135
+
136
+ ## Development
137
+
138
+ The project uses [uv](https://docs.astral.sh/uv/) for dependency and environment management.
139
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for the full local workflow and contract-update rules.
140
+
141
+ ```console
142
+ uv sync --locked --all-groups
143
+ uv run solwyn --version
144
+ uv run ruff check .
145
+ uv run ruff format --check .
146
+ uv run pytest
147
+ ```
148
+
149
+ Two test-suite properties worth knowing before contributing:
150
+
151
+ - Any change to the CLI surface (commands, flags, help text, exit codes, JSON output) requires regenerating the machine-readable contract snapshot with `scripts/generate_contract.py`; `tests/test_contract_snapshot.py` fails until you do.
152
+ - The vendored OpenAPI snapshot and its drift guards are self-invalidating by design — adopt fields properly or record a decline in the registry; never loosen a guard to make a test pass.
153
+
154
+ The vendored snapshot has two independent safeguards: public CLI CI checks its age and the
155
+ checked-in request/response contracts, while a proposed private monitor compares its content
156
+ with Core. The private monitor, ownership, and verified Core follow-ups are documented in
157
+ [Core contract follow-ups](docs/core-followups.md) and tracked in
158
+ [Core issue #403](https://github.com/solwyn-ai/core/issues/403).
159
+
160
+ Further in-repo references: [MCP release checklist](docs/mcp-release.md), [bounded MCP work and recovery](docs/mcp-bounded-work.md), [MCP diagnostics](docs/mcp-diagnostics.md), [media confirmation](docs/media-confirmation.md), and [staging smoke tests](docs/staging-smoke.md).
161
+
162
+ ## Security
163
+
164
+ Please report security issues privately as described in [SECURITY.md](SECURITY.md).
165
+
166
+ ## License
167
+
168
+ Licensed under the Apache License 2.0. See [LICENSE](LICENSE).
@@ -0,0 +1,149 @@
1
+ # Solwyn CLI
2
+
3
+ Work with Solwyn from the command line: enforce and attribute LLM spend for calls the Solwyn SDK does not instrument, inspect budgets, costs, and provider health, and recover from leaked or expired project keys — from your terminal, your scripts, or your coding agent.
4
+
5
+ This README describes solwyn-cli 0.3.0. The package is distributed on PyPI as `solwyn-cli`;
6
+ run `solwyn --version` to see which version you have installed, and use `solwyn --help`
7
+ and MCP discovery to inspect its exact surface.
8
+
9
+ ## Installation
10
+
11
+ Install the published package with uv:
12
+
13
+ ```console
14
+ uv tool install solwyn-cli
15
+ solwyn --version
16
+ ```
17
+
18
+ Or use `pipx install solwyn-cli`. For development or unreleased commands, install
19
+ from an authorized checkout with `uv tool install .`.
20
+
21
+ Requires Python 3.11 or newer. The package installs two identical executables: `solwyn` and `solwyn-cli` (an alias matching the package name).
22
+
23
+ ## Getting started
24
+
25
+ ```console
26
+ solwyn login # authenticate; use --with-key to store a project key instead
27
+ solwyn init # configure Solwyn for the current repository
28
+ solwyn status # project budget and provider health at a glance
29
+ ```
30
+
31
+ `solwyn init` authenticates, selects a project, writes local configuration, detects the provider SDKs your code imports, prints the wiring for each, and verifies your budget end-to-end. Add `--agents` to also write guidance files for Claude, Cursor, and `AGENTS.md`.
32
+
33
+ ## Three ways to use it
34
+
35
+ Calls made through the Solwyn Python SDK are enforced and attributed automatically. The CLI covers the three cases the SDK cannot reach.
36
+
37
+ ### Give a coding agent a budget
38
+
39
+ `solwyn mcp` serves read, guardrail, and attribution tools to any MCP client over local stdio, resolving configuration and credentials fresh on every call. Standard MCP capability and schema discovery exposes the exact tools and input/output shapes in the running version. `solwyn agent-context` prints a compact SDK 0.6 capability contract suitable for pasting into an agent's context, and `solwyn init --agents` writes the equivalent guidance into the repository.
40
+
41
+ ```console
42
+ solwyn --project proj_0123456789abcdef01234567 mcp --profile read # 33 read tools
43
+ solwyn --project proj_0123456789abcdef01234567 mcp # default guardrails profile, all 37 tools
44
+ solwyn doctor --mcp # verify the wiring
45
+ ```
46
+
47
+ Customer reads include account-wide alert activity and open deliveries, last firing,
48
+ advisory unpriced outage traffic, plan catalog/status/change preview, identity/email verification,
49
+ phone/SMS prerequisites, team roster/invitations, cost analysis/simulation, provider visibility and audit.
50
+ The 33 reads appear in both profiles; billing/team/member writes remain CLI-only.
51
+ See [alerts](docs/commands/alerts.mdx), [budget](docs/commands/budget.mdx),
52
+ [plan](docs/commands/plan.mdx), [account](docs/commands/account.mdx),
53
+ [team](docs/commands/team.mdx) and [invitation acceptance](docs/commands/invite.mdx).
54
+
55
+ Start with the [MCP quickstart](docs/mcp-quickstart.md). Profiles are fixed at launch and never grant permissions; see [MCP profiles and tool contracts](docs/mcp-profiles.md) and the [agent integration guide](https://docs.solwyn.ai/docs/cli/agents).
56
+
57
+ ### Gate CI on budget
58
+
59
+ One pipeline step, one exit code, no code change. `budget status` is a pure read, so a read-only key is enough.
60
+
61
+ ```console
62
+ # Exit 4 when the project is at or over 80% of its monthly budget.
63
+ solwyn --json budget status --max-utilization 80
64
+ ```
65
+
66
+ See [Gate CI on budget](https://docs.solwyn.ai/docs/cli/ci-budget-gate).
67
+
68
+ ### Meter a call the SDK does not wrap
69
+
70
+ For a `curl`, another language, or a one-off script, reserve budget before the call and settle it after. A denied check exits with code 4, so scripts stop before they spend.
71
+
72
+ ```console
73
+ # 1. Reserve immediately before the call.
74
+ solwyn budget check --provider openai --model gpt-4.1 --estimated-input-tokens 1200
75
+
76
+ # 2. Make the provider call yourself.
77
+
78
+ # 3. Settle with what the call actually used. This also records attribution.
79
+ solwyn budget confirm --call-id 12345678-1234-1234-1234-123456789abc --provider openai --model gpt-4.1 \
80
+ --reservation-id "$RESERVATION" --input-tokens 1180 --output-tokens 640
81
+ ```
82
+
83
+ The CLI's caller-owned workflow maintains parity with Solwyn Python SDK 0.6.0 semantics and covers enforcement and attribution. Use `record` for a completed call that had no reservation, such as a local model. The same loop prices image, video, audio, and speech calls by their billed units, declares fallback intent, scopes enforcement to a single agent run, and reserves for a batch of calls at once; see [Meter un-instrumented calls](https://docs.solwyn.ai/docs/cli/metering-uninstrumented-calls) for the walkthrough and [caller-owned spend reference](docs/caller-owned-spend.md) for the full rules.
84
+
85
+ ## Commands
86
+
87
+ Every command's `--help` states its exit codes, authentication requirements, and JSON output schema.
88
+
89
+ | Group | Commands |
90
+ | --- | --- |
91
+ | Setup and identity | `init`, `login`, `logout`, `whoami`, `doctor` |
92
+ | Monitoring | `status`, `costs`, `forecast`, `overview`, `providers` |
93
+ | Budget guardrails | `budget status` / `check` / `confirm` / `set`, `record`, `runs` |
94
+ | Agents | `mcp`, `mcp-config`, `agent-context` |
95
+ | Administration | `budget rules` / `rule` / `threshold`, `alerts`, `channels`, `notifications`, `webhooks`, `keys`, `projects`, `account`, `tags`, `audit`, `attest`, `plan`, `config` |
96
+
97
+ Account management includes subscription preview, change, cancellation/resume,
98
+ scheduled-change discard, hosted checkout/portal links and pending-intent dismissal.
99
+ Billing writes require owner JWT and confirmation or `--yes`; preview is a JWT
100
+ read at any role. See the [plan reference](docs/commands/plan.mdx). The [in-repo command reference](docs/commands/README.md) describes this checkout.
101
+ The published guide lives in the [CLI docs](https://docs.solwyn.ai/docs/cli).
102
+
103
+ ## Scripting
104
+
105
+ API and setup commands support global `--json` for schema-bearing JSON output (each payload names its schema, e.g. `solwyn.costs.v1`), and exit codes are stable and documented per command: `0` success, `2` usage, with distinct codes for API, auth, budget-denial, and not-found failures. The local `config` commands emit plain text. Global flags select the project (`--project`), API base URL (`--api-url`), and output format, and go before the subcommand.
106
+
107
+ ## Trust posture
108
+
109
+ Solwyn CLI:
110
+
111
+ - sends only your own spend events; `sdk_instance_id` is an invocation ID (the retained operation UUID for recoverable MCP batches); no telemetry;
112
+ - never captures, logs, or transmits prompts or responses;
113
+ - never collects, stores, or proxies provider API keys;
114
+ - has no telemetry, update checks, or phone-home behavior; and
115
+ - stores Solwyn credentials only in the operating system keychain, never in configuration files, command-line arguments, or output.
116
+
117
+ ## Development
118
+
119
+ The project uses [uv](https://docs.astral.sh/uv/) for dependency and environment management.
120
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for the full local workflow and contract-update rules.
121
+
122
+ ```console
123
+ uv sync --locked --all-groups
124
+ uv run solwyn --version
125
+ uv run ruff check .
126
+ uv run ruff format --check .
127
+ uv run pytest
128
+ ```
129
+
130
+ Two test-suite properties worth knowing before contributing:
131
+
132
+ - Any change to the CLI surface (commands, flags, help text, exit codes, JSON output) requires regenerating the machine-readable contract snapshot with `scripts/generate_contract.py`; `tests/test_contract_snapshot.py` fails until you do.
133
+ - The vendored OpenAPI snapshot and its drift guards are self-invalidating by design — adopt fields properly or record a decline in the registry; never loosen a guard to make a test pass.
134
+
135
+ The vendored snapshot has two independent safeguards: public CLI CI checks its age and the
136
+ checked-in request/response contracts, while a proposed private monitor compares its content
137
+ with Core. The private monitor, ownership, and verified Core follow-ups are documented in
138
+ [Core contract follow-ups](docs/core-followups.md) and tracked in
139
+ [Core issue #403](https://github.com/solwyn-ai/core/issues/403).
140
+
141
+ Further in-repo references: [MCP release checklist](docs/mcp-release.md), [bounded MCP work and recovery](docs/mcp-bounded-work.md), [MCP diagnostics](docs/mcp-diagnostics.md), [media confirmation](docs/media-confirmation.md), and [staging smoke tests](docs/staging-smoke.md).
142
+
143
+ ## Security
144
+
145
+ Please report security issues privately as described in [SECURITY.md](SECURITY.md).
146
+
147
+ ## License
148
+
149
+ Licensed under the Apache License 2.0. See [LICENSE](LICENSE).
@@ -0,0 +1,176 @@
1
+ # Caller-owned spend reference
2
+
3
+ The contract details for attributing, batching, and governing spend the CLI handles
4
+ on the caller's behalf. The [README](../README.md) covers the common case; this page
5
+ holds the full rules for `record`, `budget check --batch`, and budget rules.
6
+
7
+ ## Recording caller-owned spend with `record`
8
+
9
+ `budget confirm` records attribution after successful settlement by default.
10
+ `--no-record` skips attribution; a recording failure warns without undoing settlement.
11
+ Use `record` for completed calls that have no reservation, including local providers:
12
+
13
+ ```sh
14
+ export SOLWYN_AGENT_RUN_ID="job-42"
15
+ export SOLWYN_TAGS="environment=prod,team=ops"
16
+ solwyn record --provider ollama --model llama3 --input-tokens 120 --output-tokens 30
17
+ solwyn record --batch events.json --json
18
+ solwyn --project YOUR_PROJECT_ID tags list
19
+ ```
20
+
21
+ Reuse the same canonical lowercase `--call-id` UUID for retries of one logical event
22
+ (generate one with `uuidgen | tr A-F a-f`). `record --batch FILE|-` takes a nonempty
23
+ JSON array of event inputs and chunks it into at most 1000 events per request. Each
24
+ invocation uses a fresh `sdk_instance_id` across all its chunks. Never send `cost_usd`
25
+ or `lease_id`; Core computes prices. Inspect `rejected` and `duplicates`: call-ID
26
+ replays succeed, while rejections and legacy timestamp collisions exit 1. On an uncertain
27
+ or partial write, retain the returned `call_ids` in input order before retrying; the
28
+ result has `status=failed` and preserves the dispositions already received.
29
+
30
+ Core's explicitly unaccepted ingest capacity responses use one of three fixed
31
+ `detail` strings with `Retry-After: 1`: `Budget admission is busy; retry shortly`,
32
+ `Account tag registry is busy; retry the batch.`, or
33
+ `Accounting maintenance is in progress; retry the batch.` These prove that
34
+ individual attempt recorded nothing. The client retries ingest once when any
35
+ `Retry-After` is present, sharing the existing 429 retry budget and 10-second
36
+ wait cap; this replay policy does not itself prove absence.
37
+ If a recognized rejection remains, `record` exits 1 with a retry hint and
38
+ `status=not_recorded` only when no earlier chunk completed and every attempt
39
+ for the failed chunk is provably nonaccepting. Recognized rejections and Core's
40
+ pre-ingest 429/401 responses meet that boundary. An earlier potentially accepted
41
+ attempt stays uncertain even if the final retry is a recognized rejection;
42
+ JWT refresh cannot erase that uncertainty or replenish the shared retry allowance.
43
+ A valid 202 with complete canonical dispositions resolves the call normally.
44
+ A partial multi-chunk invocation retains `status=failed` and all known
45
+ dispositions; the recognized
46
+ rejection proves only the failed chunk was unaccepted if its earlier attempts
47
+ also meet that boundary. A generic/proxy 503, a missing or different header,
48
+ or a transport failure remains uncertain:
49
+ CLI retains `status=failed` and MCP reports `recording=unknown`. Always retry
50
+ attribution with the original `call_ids` and attempt indices.
51
+
52
+ Budget and quota periods use Core's server receive time (`received_at`), while
53
+ cost analytics use the stored event `timestamp`. A backdated `record --batch`
54
+ event counts against the budget and quota period in which Core receives it,
55
+ but appears on its original day in `costs` if that timestamp is within Core's
56
+ accepted clock bounds. Core clamps excessive future skew and, when a past
57
+ horizon is configured, older timestamps; retention can also hide old analytics.
58
+ Backdating records does not move spend out of the current budget period.
59
+
60
+ Repeat `--tag key=value` to override environment tags. Keys and values preserve
61
+ whitespace and case; empty values and equals signs in values are legal, commas in
62
+ flag values are not. Tags allow at most 10 keys, keys of 1–64 characters, and values
63
+ up to 256 characters, with no NUL. Reusing `SOLWYN_AGENT_RUN_ID` groups a job's calls;
64
+ otherwise Core creates automatic runs from each invocation's ID.
65
+
66
+ Denied budget checks also record receipts unless `--no-record` is set. Supply
67
+ `--estimated-output-tokens` to attribute the upper savings bound. Tag submission
68
+ and enforcement work on every tier; discovery is account-scoped and requires Team.
69
+ `tags values KEY --prefix Q` pages through values; retiring a key frees an active
70
+ key slot, and later successful ingest may reactivate it.
71
+
72
+ ## Batch budget checks
73
+
74
+ `solwyn budget check --batch checks.json --json` reads a nonempty JSON array of
75
+ check bodies; use `--batch -` for stdin. For example:
76
+
77
+ ```json
78
+ [{"model":"gpt-4o","provider":"openai","estimated_input_tokens":1200,"agent_run_id":"job-42","tags":{"environment":"prod"}}]
79
+ ```
80
+
81
+ All bodies validate before submission. Requests contain at most 32 checks, preserve
82
+ input order, and count every item against `checks_per_minute`. Each allowed item
83
+ normally holds its own reservation: confirm it after its provider call. A fail-open
84
+ item has a null reservation and must not be confirmed. Do not poll or repeat checks
85
+ to refresh reservations. Denied items record one receipt each unless `--no-record`
86
+ is set, sharing a fresh invocation ID. `--estimated-output-tokens` applies the same
87
+ savings upper bound to every denial. Put all other per-check options in the JSON;
88
+ missing tags and run IDs inherit `SOLWYN_TAGS` and `SOLWYN_AGENT_RUN_ID`. Explicit
89
+ nulls suppress these defaults. A run ID opts into termination directives.
90
+
91
+ The `solwyn.budget.check.batch.v1` payload has index-aligned `results`: each contains
92
+ either a nullable `result`, or `error_code` and `error_message`. Unknown models are
93
+ per-item errors. All allowed exits 0, any denial exits 4, and errors without a denial
94
+ exit 1. A request-level 404 or 503 fails the chunk. If an earlier chunk completed,
95
+ its results and reservation IDs remain in output, alongside `failed_chunk_start`
96
+ and `total_checks`; later chunks were not submitted. Every legacy batch 503
97
+ leaves reservation state within the failed chunk unknown, including
98
+ `Budget admission is busy; retry shortly` with `Retry-After: 1`. Core uses that
99
+ same response both before admission and after the legacy loop has committed
100
+ earlier item reservations, so the response cannot distinguish those cases.
101
+ This uncertainty applies even to the first chunk. Do not replay completed
102
+ checks, assume rollback, or blindly resubmit the failed chunk. The CLI does not
103
+ automatically replay budget checks.
104
+
105
+ For single `/budgets/check` and durable `/budgets/check/batches`, that fixed
106
+ busy detail proves no reservation was made by the request; retrying admission
107
+ in a moment is safe. This is a reservation guarantee: single checks can already
108
+ have folded advisory `uncounted_calls`/`uncounted_tokens` before lock contention.
109
+ A retry can overcount this advisory upper-bound telemetry. Preserve caller
110
+ values; the hint does not promise an absence of all side effects.
111
+ The MCP `budget_check_batch` tool submits at most 32 checks to Core’s durable
112
+ journal with a caller-retained UUIDv7. Recovery uses GET only; explicit denial
113
+ attribution retry preserves its exact event. See [bounded MCP work and recovery](mcp-bounded-work.md)
114
+ for limits, required Core rollout, indexed outcomes and recording uncertainty.
115
+
116
+
117
+ ## Budget rules and per-run caps
118
+
119
+ List rule conditions, routing, and separate pause/snooze state:
120
+
121
+ ```sh
122
+ solwyn --project proj_example budget rules list
123
+ solwyn --json --project proj_example budget rules list
124
+ ```
125
+
126
+ Rule mutations require a user login with owner/admin permissions. Each rule may
127
+ reference notification channels with repeatable `--channel ID` options:
128
+
129
+ ```sh
130
+ solwyn budget rule add --type budget_threshold --percent 80
131
+ solwyn budget rule add --type runaway_run --spend 5 --mode hard_deny
132
+ solwyn budget rule add --type scoped_budget --scope tag --match env --value prod --limit 25 --mode hard_deny
133
+ solwyn budget rule add --type forecast_overrun --spend 200
134
+ solwyn budget rule add --type daily_anomaly --multiplier 2 --lookback 7
135
+ solwyn budget rule add --type unit_cost_anomaly --multiplier 3
136
+ ```
137
+
138
+ Runaway `--calls N` and `--window MIN` must be supplied together. Scoped caps also
139
+ accept `--scope model|provider|agent_run`; `--value` is valid only for tag scope.
140
+ The rule count limit includes all six types. Adding a rule preserves the complete
141
+ budget configuration and re-reads it before writing. Core has no concurrency token,
142
+ so this detects changes before the final write but cannot eliminate the remaining
143
+ race. A 503 after a write triggers a read to confirm the complete configuration;
144
+ an unconfirmed outcome requires reviewing the budget before retrying.
145
+
146
+ ```sh
147
+ solwyn budget rule pause RULE_KEY
148
+ solwyn budget rule resume RULE_KEY
149
+ solwyn budget rule snooze RULE_KEY --until +2h
150
+ solwyn budget rule unsnooze RULE_KEY
151
+ solwyn budget rule remove RULE_KEY
152
+ solwyn budget threshold snooze 80 --until 2026-12-01T12:00:00Z
153
+ solwyn budget threshold unsnooze 80
154
+ solwyn budget restore-defaults
155
+ ```
156
+
157
+ Snooze accepts timezone-aware ISO datetimes or `+30m`, `+2h`, and `+1d` durations,
158
+ which the CLI converts to absolute timestamps. **A snoozed hard-deny rule still
159
+ denies; pause releases enforcement.** Rule keys are content-addressed: editing
160
+ keyed condition fields changes the key. Restore-defaults preserves non-threshold
161
+ rules, and the CLI re-reads and prints the full rule state afterward.
162
+
163
+ Preview routing with a project key or user login, including an unsaved condition:
164
+
165
+ ```sh
166
+ solwyn budget rule preview
167
+ solwyn budget rule preview RULE_KEY --channel CHANNEL_ID
168
+ solwyn budget rule preview --type runaway_run --spend 5 --mode hard_deny
169
+ ```
170
+
171
+ During interactive project creation, `solwyn init --run-cap 5` adds a wildcard
172
+ `runaway_run` rule with `hard_deny` immediately after creation. It caps every run at
173
+ `min(caps)` when run identity is supplied; scoped run caps and wildcard caps share
174
+ the strictest limit. For an existing project, use `budget rule add` instead.
175
+ The default MCP surface includes the pure-read `list_budget_rules` tool; rule
176
+ mutations remain CLI operations.
@@ -0,0 +1,36 @@
1
+ # Command reference
2
+
3
+ These references describe solwyn-cli 0.3.0. Earlier releases, including 0.2.0, lack many of
4
+ these commands; use installed `--help` and MCP discovery for an installed version's exact surface.
5
+ Global selection/output flags precede commands. Core authorizes every request.
6
+
7
+ - [Account and identity, rename and recovery](account.mdx)
8
+ - [Alerts](alerts.mdx)
9
+ - [Attest](attest.mdx)
10
+ - [Account audit trail](audit.mdx)
11
+ - [Budget](budget.mdx)
12
+ - [Notification channels](channels.mdx)
13
+ - [Local configuration](config.mdx)
14
+ - [Costs](costs.mdx)
15
+ - [Forecast](forecast.mdx)
16
+ - [Repository setup](init.mdx)
17
+ - [Invitation preview and acceptance](invite.mdx)
18
+ - [Project keys](keys.mdx)
19
+ - [Login and logout](login.mdx)
20
+ - [Project notifications](notifications.mdx)
21
+ - [Overview](overview.mdx)
22
+ - [Plan](plan.mdx)
23
+ - [Projects](projects.mdx)
24
+ - [Provider visibility](providers.mdx)
25
+ - [Agent runs](runs.mdx)
26
+ - [Status](status.mdx)
27
+ - [Tags](tags.mdx)
28
+ - [Team members and invitations](team.mdx)
29
+ - [Webhooks](webhooks.mdx)
30
+ - [Identity](whoami.mdx)
31
+
32
+ For account settings, see [account rename](account.mdx#rename-the-current-account).
33
+ After membership removal, see [personal-account recovery](account.mdx#recover-a-personal-account).
34
+
35
+ For caller-owned spend, see [the metering reference](../caller-owned-spend.md).
36
+ For MCP, see [the quickstart](../mcp-quickstart.md).
@@ -0,0 +1,59 @@
1
+ # Account and identity reads
2
+
3
+ ```sh
4
+ solwyn whoami
5
+ solwyn --json whoami
6
+ solwyn account phone show
7
+ solwyn --json account phone show
8
+ ```
9
+
10
+ JWT `whoami` shows email verification along with user/account identity, role,
11
+ seats and projects (`solwyn.whoami.v1`). Its strict identity parser adopts
12
+ `email_verified`, first name and marketing email subscription state. Project keys
13
+ return local authentication and selected-project context without inventing a user
14
+ or verified email, and never reveal raw key material. MCP provides `get_whoami`.
15
+
16
+ `account phone show` (`solwyn.account.phone.v1`) requires JWT and reads the current
17
+ user's state: none, pending, verified or verified_with_pending_change; verified
18
+ and pending numbers, verification/resend timestamps, and SMS consent/disclosure
19
+ state. Verified phone and SMS consent are prerequisites for SMS notifications.
20
+ Absent timestamps remain null. Verification and consent changes stay in the
21
+ dashboard. MCP provides `get_account_phone` in both profiles. Account recovery
22
+ remains CLI-only.
23
+
24
+ ## Rename the current account
25
+
26
+ ```sh
27
+ solwyn account rename "New account name"
28
+ solwyn --json account rename "New account name" --yes
29
+ ```
30
+
31
+ Rename requires owner JWT. It reads the current account and displays its ID,
32
+ old/new names and invitation-email effects before confirmation or `--yes`.
33
+ Non-TTY use without `--yes` exits 2 before reading credentials or HTTP.
34
+ The PATCH sends only `display_name`; `alert_email_override` remains untouched.
35
+ Use the existing `account alert-email show|set|clear` commands to manage that
36
+ independent preference.
37
+
38
+ Core normalizes display names, rejects controls/bidi/zero-width characters and
39
+ limits them to 120 characters. Invalid input uses fixed errors without reflecting
40
+ validation values. `solwyn.account.rename.v1` returns the complete strict account
41
+ response: ID, display name, tier, alert-email override, seat limit/usage and your
42
+ role. Rename remains CLI-only. Inspect account state before deliberately retrying
43
+ an uncertain write; see [team management](team.mdx).
44
+
45
+ ## Recover a personal account
46
+
47
+ ```sh
48
+ solwyn account recover
49
+ solwyn --json account recover
50
+ ```
51
+
52
+ `account recover` requires JWT but does not require an active membership. It
53
+ idempotently creates a personal account after membership removal, or returns
54
+ the existing account when one is active. The POST goes to
55
+ `/api/v1/accounts/me/personal`; `solwyn.account.recover.v1` returns `account_id`.
56
+ The command stays CLI-only. A project key masking login must be unselected;
57
+ there is no credential fallback. Exit codes are 0 success, 1 API/invalid response,
58
+ 2 usage and 3 auth. Core maps a missing user to 401, so there is no not-found
59
+ exit for this route.
@@ -40,4 +40,37 @@ Account configuration uses `solwyn.alerts.account.v1`. Any account member with J
40
40
 
41
41
  A definite 401 rejection may refresh JWT once; a definite 429 rejection uses the client's bounded rate-limit retry. Mutations are never replayed after 503 or transport failures. If a mutation's outcome is uncertain, inspect `alerts account show` before deciding whether to retry. Role failures exit 3 and point to `whoami`; key authentication failures point to login. Upgrade errors preserve Core's message, allowed values when present, and safe dashboard path. No checkout URL is opened.
42
42
 
43
- The default MCP surface adds only `list_alert_events`, with project/account selection, window and rule filters, cursor/all-pages options, and local failed-only filtering. It exposes the same typed history and receipt fields. Account configuration mutation tools are not registered.
43
+ The MCP surface includes `list_alert_events`, with project/account selection, window and rule filters, cursor/all-pages options, and local failed-only filtering. It exposes the same typed history and receipt fields. Account configuration mutation tools are not registered.
44
+
45
+
46
+ ```sh
47
+ solwyn alerts activity --range 7d --event-type fired --all
48
+ solwyn alerts activity --cursor CURSOR
49
+ solwyn alerts pending --all
50
+ solwyn --json alerts pending --fail-if-open
51
+ solwyn budget rules list --with-last-fired
52
+ solwyn alerts account show --with-last-fired
53
+ ```
54
+
55
+ Activity is the JWT-only feed across **all projects plus account scope**, unlike
56
+ `alerts list --account`. It supports range 7d/30d/90d (default 30d), event type
57
+ fired/snoozed/unsnoozed/paused/resumed, cursor and all-pages options. Pending reads
58
+ operationally open deliveries without a retention window, with full receipt legs,
59
+ attempt counts and next retry timestamps. Default listing exits 0; `--fail-if-open`
60
+ prints data first then exits 1 with `open_alert_deliveries` and local retry guidance
61
+ when the listed data contains open deliveries. Use `--all` for a complete health
62
+ check. These outputs use `solwyn.alerts.activity.v1` and `solwyn.alerts.pending.v1`.
63
+
64
+ Last firing is opt-in and requires JWT, including project rules. Selectors come
65
+ from the fetched rules, are chunked at 100, and match thresholds by percent so
66
+ budget-limit edits preserve history. Budget output maps rule keys to firing events
67
+ or null; account output includes last firing and latest lifecycle event, merging
68
+ current account-ID and legacy `account_spend` history by timestamp and event ID.
69
+ Core's
70
+ default 30d window and plan retention apply; null does not prove a rule never
71
+ fired. Without the flag there is no extra request. MCP exposes
72
+ `list_alert_activity`, `list_open_alert_deliveries`, `get_account_alert` and the
73
+ same option on `list_budget_rules`; latest-events POST is a read. No alert
74
+ mutations are exposed. MCP pagination remains bounded, with first unread cursor
75
+ preserved on errors; CLI `--all` fails without printing a false complete result
76
+ if a later page cannot be read.