orbi-cli 0.7.30__tar.gz → 0.7.32__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 (252) hide show
  1. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/PKG-INFO +1 -1
  2. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/pyproject.toml +1 -1
  3. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/__init__.py +1 -1
  4. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/clarify.py +13 -22
  5. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/cli_commands.py +12 -45
  6. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/cli_parser.py +3 -3
  7. orbi_cli-0.7.32/src/orbi/draft.py +853 -0
  8. orbi_cli-0.7.32/src/orbi/draft_cli.py +248 -0
  9. orbi_cli-0.7.32/src/orbi/draft_marker.py +137 -0
  10. orbi_cli-0.7.32/src/orbi/extensions/draft_tools.ts +131 -0
  11. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/journal.py +5 -0
  12. orbi_cli-0.7.32/src/orbi/ops_delivery.py +137 -0
  13. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/pi_command.py +115 -86
  14. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/runner.py +14 -71
  15. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/session_command.py +44 -1
  16. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/split_command.py +51 -34
  17. orbi_cli-0.7.32/src/orbi/ticket_criteria.py +38 -0
  18. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi_cli.egg-info/PKG-INFO +1 -1
  19. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi_cli.egg-info/SOURCES.txt +16 -1
  20. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_blocked_comment.py +1 -1
  21. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_bootstrap_adapters.py +2 -2
  22. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_bootstrap_delivery.py +2 -1
  23. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_bootstrap_preflight.py +5 -5
  24. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_bootstrap_release.py +1 -1
  25. orbi_cli-0.7.32/tests/test_bootstrap_runner_claim_resume.py +1025 -0
  26. orbi_cli-0.7.32/tests/test_bootstrap_runner_failure_report.py +570 -0
  27. orbi_cli-0.7.32/tests/test_bootstrap_runner_main.py +1059 -0
  28. orbi_cli-0.7.32/tests/test_bootstrap_runner_milestone.py +1024 -0
  29. orbi_cli-0.7.32/tests/test_bootstrap_runner_outcome.py +1095 -0
  30. orbi_cli-0.7.32/tests/test_bootstrap_runner_prompt.py +886 -0
  31. orbi_cli-0.7.32/tests/test_bootstrap_runner_reconcile.py +546 -0
  32. orbi_cli-0.7.32/tests/test_bootstrap_runner_session.py +816 -0
  33. orbi_cli-0.7.32/tests/test_bootstrap_runner_tickets.py +668 -0
  34. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_clarify.py +1 -1
  35. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_concurrency_e2e.py +1 -1
  36. orbi_cli-0.7.32/tests/test_draft.py +1176 -0
  37. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_ops_e2e.py +8 -12
  38. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_orbi.py +3 -3
  39. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_resume_continue_e2e.py +2 -10
  40. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_resume_e2e.py +1 -10
  41. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_resume_pr.py +1 -1
  42. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_run_id_e2e.py +1 -10
  43. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_runner_config.py +1 -1
  44. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_runner_health.py +5 -4
  45. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_seam.py +5 -6
  46. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_size_ratchet.py +86 -2
  47. orbi_cli-0.7.32/tests/test_suite_hygiene.py +112 -0
  48. orbi_cli-0.7.30/tests/test_bootstrap_runner.py +0 -7459
  49. orbi_cli-0.7.30/tests/test_suite_hygiene.py +0 -63
  50. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/LICENSE +0 -0
  51. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/README.md +0 -0
  52. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/docs/licenses/sustainable-use-license.md +0 -0
  53. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/setup.cfg +0 -0
  54. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/amend_command.py +0 -0
  55. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/base_ci_red.py +0 -0
  56. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/blocked_comment.py +0 -0
  57. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/branch_reclaim.py +0 -0
  58. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/check_permission.py +0 -0
  59. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/checks.py +0 -0
  60. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/claim.py +0 -0
  61. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/cli.py +0 -0
  62. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/cli_doctor.py +0 -0
  63. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/cli_source.py +0 -0
  64. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/cli_status.py +0 -0
  65. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/cli_ticket_command.py +0 -0
  66. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/comment_kind.py +0 -0
  67. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/comment_rest_id.py +0 -0
  68. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/comment_trust.py +0 -0
  69. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/config.py +0 -0
  70. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/delivery_comment.py +0 -0
  71. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/delivery_labels.py +0 -0
  72. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/delivery_scene.py +0 -0
  73. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/engine_source.py +0 -0
  74. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/example_config.toml +0 -0
  75. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/extensions/clarify_verdict.ts +0 -0
  76. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/failure.py +0 -0
  77. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/failure_report.py +0 -0
  78. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/gh_response.py +0 -0
  79. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/git_identity.py +0 -0
  80. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/git_transport.py +0 -0
  81. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/github.py +0 -0
  82. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/github_feedback.py +0 -0
  83. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/gitops.py +0 -0
  84. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/human_review.py +0 -0
  85. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/language.py +0 -0
  86. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/language_terms.py +0 -0
  87. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/launchd_deploy.py +0 -0
  88. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/merge_exec.py +0 -0
  89. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/merge_gate.py +0 -0
  90. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/merge_handoff.py +0 -0
  91. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/milestone.py +0 -0
  92. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/milestone_command.py +0 -0
  93. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/notify.py +0 -0
  94. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/pi_activity.py +0 -0
  95. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/pi_idle.py +0 -0
  96. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/pi_process.py +0 -0
  97. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/pi_recovery.py +0 -0
  98. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/pi_session.py +0 -0
  99. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/pi_stream_log.py +0 -0
  100. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/pilot_setup.py +0 -0
  101. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/pilot_slots.py +0 -0
  102. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/pr_verification.py +0 -0
  103. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/progress.py +0 -0
  104. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/progress_display.py +0 -0
  105. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/progress_outcome.py +0 -0
  106. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/progress_summary.py +0 -0
  107. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/release.py +0 -0
  108. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/release_closeout.py +0 -0
  109. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/release_comments.py +0 -0
  110. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/release_declaration.py +0 -0
  111. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/release_git.py +0 -0
  112. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/release_notes.py +0 -0
  113. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/release_run.py +0 -0
  114. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/repo_config.py +0 -0
  115. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/resume_scan.py +0 -0
  116. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/resume_verification.py +0 -0
  117. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/review_merge.py +0 -0
  118. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/review_rounds.py +0 -0
  119. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/review_verdict.py +0 -0
  120. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/run_state.py +0 -0
  121. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/runner_health.py +0 -0
  122. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/runner_marker.py +0 -0
  123. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/runner_source.py +0 -0
  124. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/scene.py +0 -0
  125. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/scheduler.py +0 -0
  126. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/scheduler_units.py +0 -0
  127. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/setup_checks.py +0 -0
  128. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/setup_config.py +0 -0
  129. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/source_pool.py +0 -0
  130. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/status_observe.py +0 -0
  131. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/suggest.py +0 -0
  132. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/systemd_deploy.py +0 -0
  133. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/ticket_command.py +0 -0
  134. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/ticket_command_registry.py +0 -0
  135. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi/user_summary.py +0 -0
  136. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi_cli.egg-info/dependency_links.txt +0 -0
  137. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi_cli.egg-info/entry_points.txt +0 -0
  138. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/src/orbi_cli.egg-info/top_level.txt +0 -0
  139. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_agents_md.py +0 -0
  140. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_amend_command.py +0 -0
  141. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_apply_label_patch.py +0 -0
  142. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_base_branch_failure.py +0 -0
  143. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_base_ci_red.py +0 -0
  144. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_bootstrap_pi.py +0 -0
  145. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_branch_reclaim.py +0 -0
  146. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_check_permission.py +0 -0
  147. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_ci_failure_issue_workflow.py +0 -0
  148. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_ci_failure_triage.py +0 -0
  149. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_ci_macos_workflow.py +0 -0
  150. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_ci_workflow.py +0 -0
  151. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_claude_plugin.py +0 -0
  152. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_cli_golden.py +0 -0
  153. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_cli_install.py +0 -0
  154. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_cli_milestone.py +0 -0
  155. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_cli_packaging.py +0 -0
  156. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_cli_source.py +0 -0
  157. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_cli_ticket_commands.py +0 -0
  158. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_command_receipt_contract.py +0 -0
  159. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_comment_identity.py +0 -0
  160. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_comment_readers_contract.py +0 -0
  161. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_comment_rest_id.py +0 -0
  162. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_comment_trust.py +0 -0
  163. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_constitution.py +0 -0
  164. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_coverage_gate.py +0 -0
  165. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_deliver_pr_fakes.py +0 -0
  166. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_delivery_branch_delete.py +0 -0
  167. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_delivery_labels.py +0 -0
  168. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_delivery_scene.py +0 -0
  169. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_docker_docs.py +0 -0
  170. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_docker_entrypoint.py +0 -0
  171. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_docker_image_workflow.py +0 -0
  172. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_docs_i18n.py +0 -0
  173. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_docs_issue_shapes.py +0 -0
  174. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_docs_labels.py +0 -0
  175. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_docs_mermaid.py +0 -0
  176. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_docs_releases.py +0 -0
  177. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_docs_single_source.py +0 -0
  178. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_docs_site.py +0 -0
  179. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_engine_source.py +0 -0
  180. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_failure.py +0 -0
  181. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_failure_report.py +0 -0
  182. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_fix_needed_loop.py +0 -0
  183. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_gh_read_retry.py +0 -0
  184. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_gh_response.py +0 -0
  185. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_git_base_smoke.py +0 -0
  186. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_git_merge_smoke.py +0 -0
  187. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_git_network_retry.py +0 -0
  188. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_git_transport.py +0 -0
  189. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_github.py +0 -0
  190. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_github_fakes.py +0 -0
  191. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_gitops.py +0 -0
  192. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_gitops_fakes.py +0 -0
  193. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_human_review.py +0 -0
  194. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_import_graph.py +0 -0
  195. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_install_sh.py +0 -0
  196. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_issue_1367.py +0 -0
  197. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_issue_461.py +0 -0
  198. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_issue_template_config.py +0 -0
  199. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_journal.py +0 -0
  200. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_journal_events.py +0 -0
  201. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_launchd_deploy.py +0 -0
  202. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_license.py +0 -0
  203. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_merge_exec_extraction.py +0 -0
  204. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_message_language.py +0 -0
  205. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_milestone_command.py +0 -0
  206. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_notify.py +0 -0
  207. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_orbi_dashboard.py +0 -0
  208. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_orbi_exporter.py +0 -0
  209. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_patch_ratchet.py +0 -0
  210. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_pi_activity.py +0 -0
  211. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_pi_child_reap.py +0 -0
  212. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_pi_command.py +0 -0
  213. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_pi_extensions.py +0 -0
  214. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_pi_provider_templates.py +0 -0
  215. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_pi_recovery.py +0 -0
  216. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_pi_session.py +0 -0
  217. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_pilot_setup.py +0 -0
  218. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_pilot_slots.py +0 -0
  219. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_pr_issue_link_workflow.py +0 -0
  220. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_pr_verification.py +0 -0
  221. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_prerequisite_check.py +0 -0
  222. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_progress.py +0 -0
  223. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_progress_wiring.py +0 -0
  224. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_prompt_contract.py +0 -0
  225. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_public_contracts.py +0 -0
  226. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_public_helpers.py +0 -0
  227. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_publish_workflow.py +0 -0
  228. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_release_docs_workflow.py +0 -0
  229. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_release_extraction.py +0 -0
  230. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_release_ticket_templates.py +0 -0
  231. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_repo_config.py +0 -0
  232. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_review_merge.py +0 -0
  233. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_review_verdict.py +0 -0
  234. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_run_artifacts.py +0 -0
  235. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_run_id_fixture.py +0 -0
  236. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_runner_source_freshness.py +0 -0
  237. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_scene.py +0 -0
  238. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_scheduler.py +0 -0
  239. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_setup_output_golden.py +0 -0
  240. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_split_command.py +0 -0
  241. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_src_layout.py +0 -0
  242. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_status_observe.py +0 -0
  243. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_steering_review.py +0 -0
  244. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_suggest.py +0 -0
  245. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_systemd_deploy.py +0 -0
  246. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_systemd_timer.py +0 -0
  247. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_ticket_command.py +0 -0
  248. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_ticket_command_registration.py +0 -0
  249. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_user_acceptance_contract.py +0 -0
  250. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_user_summary.py +0 -0
  251. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_versioned_comment_block.py +0 -0
  252. {orbi_cli-0.7.30 → orbi_cli-0.7.32}/tests/test_worktree_reclaim.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orbi-cli
3
- Version: 0.7.30
3
+ Version: 0.7.32
4
4
  Summary: Orbi — local AI development worker: claims GitHub Issues, runs Pi in isolated worktrees, and delivers PRs (GitHub Issues + labels are the only state store).
5
5
  Author: xqliu
6
6
  License-Expression: AGPL-3.0-only OR LicenseRef-Sustainable-Use-1.0
@@ -44,7 +44,7 @@ build-backend = "setuptools.build_meta"
44
44
 
45
45
  [project]
46
46
  name = "orbi-cli"
47
- version = "0.7.30"
47
+ version = "0.7.32"
48
48
  description = "Orbi — local AI development worker: claims GitHub Issues, runs Pi in isolated worktrees, and delivers PRs (GitHub Issues + labels are the only state store)."
49
49
  readme = "README.md"
50
50
  requires-python = ">=3.14"
@@ -18,4 +18,4 @@ the package would shadow the installed package for every process with
18
18
  the checkout root on sys.path. The direct-execution compatibility entry
19
19
  is `python3 -m orbi.cli` (development path only).
20
20
  """
21
- __version__ = "0.7.30"
21
+ __version__ = "0.7.32"
@@ -51,7 +51,8 @@ from pathlib import Path
51
51
  from string import Formatter
52
52
  from typing import TYPE_CHECKING
53
53
 
54
- from orbi import language, notify, user_summary
54
+ from orbi import draft_marker, language, notify, user_summary
55
+ from orbi.ticket_criteria import TICKET_CHECK_CRITERIA
55
56
  from orbi.delivery_labels import NEEDS_DETAIL_LABEL, READY_LABEL
56
57
  from orbi.github import (
57
58
  authenticated_github_login, comment_issue, edit_issue, issue_comments,
@@ -99,27 +100,8 @@ CLARIFY_SYSTEM_PROMPT = (
99
100
  "only the Issue text, and judge what it says rather than the shape "
100
101
  "it is written in: separate template headings are optional, so a "
101
102
  "missing heading is never a missing piece.\n\n"
102
- "Three checks:\n"
103
- "1. observable_result — the ticket states the observable result: "
104
- "what a user sees or does differently once the change ships. A "
105
- "concrete runtime failure — an error, a crash, a wrong returned "
106
- "value, a reproduced misbehavior named with its evidence — is such "
107
- "a result together with its unambiguous implied correction (\"it "
108
- "should not do this\"), even when no goal is written out "
109
- "explicitly.\n"
110
- "2. acceptance_condition — the ticket states an acceptance "
111
- "condition: a concrete way to tell a finished delivery from an "
112
- "unfinished one. Historical diagnostic evidence is not one: a run "
113
- "that already happened, a count from an earlier attempt or a "
114
- "symptom read from a log says what the author observed, not what "
115
- "the delivery must achieve. Report this check only when no "
116
- "condition is stated at all, and never invent a target, a cleanup "
117
- "policy or a delivery scope for it.\n"
118
- "3. single_outcome — the ticket is one runtime outcome: one fix or "
119
- "one change, not several unrelated things. One failing behavior, "
120
- "or several symptoms of the same behavior, is one outcome no "
121
- "matter how many bullets or sentences describe it; report this "
122
- "check only when the text bundles independent deliverables.\n\n"
103
+ + TICKET_CHECK_CRITERIA
104
+ + "\n\n"
123
105
  "Answer by calling the clarify_verdict tool exactly once: it is "
124
106
  "the only tool in this session, and the run ends with that call. Do "
125
107
  "not answer in prose.\n\n"
@@ -936,6 +918,15 @@ def enforce(issue: dict, config: RunnerConfig, source_repo: str,
936
918
  # ticket claimable, and the next tick would judge it again — the gate
937
919
  # would repeat instead of stopping.
938
920
  ready_label = config.dispatch_label or READY_LABEL
921
+ if draft_marker.own_draft_unchanged(issue):
922
+ # Issue #2041: `orbi draft` already judged this exact body with
923
+ # THIS function before the person ever saw it, and nobody has
924
+ # edited it since (the marker's fingerprint still matches). Orbi
925
+ # does not bounce its own drafts: the check would repeat a
926
+ # judgment it already made, and a draft that failed it after the
927
+ # rewrite is the person's to submit — not the gate's to stop.
928
+ event("clarify_draft_skipped", issue=issue["number"])
929
+ return True
939
930
  if already_stopped(issue, source_repo):
940
931
  # Issue #1904: the automation re-added the claim label without
941
932
  # touching the text. The stop already named the missing pieces
@@ -11,7 +11,6 @@ loading stay in the entry module, which owns the diagnostics.
11
11
  """
12
12
  from __future__ import annotations
13
13
 
14
- import json
15
14
  import logging
16
15
  import re
17
16
  import sys
@@ -20,6 +19,7 @@ from pathlib import Path
20
19
  from orbi import (
21
20
  cli_status,
22
21
  config as config_domain,
22
+ draft_cli,
23
23
  engine_source,
24
24
  notify,
25
25
  pilot_setup,
@@ -33,11 +33,7 @@ from orbi.cli_ticket_command import command_ticket_command
33
33
  from orbi.delivery_labels import READY_LABEL
34
34
  from orbi.milestone_command import MilestoneSetError, milestone_set
35
35
  from orbi.runner import freeze_base, run_command
36
- from orbi.session_command import (
37
- find_session_file,
38
- follow_session_file,
39
- format_session_line,
40
- )
36
+ from orbi.session_command import command_session
41
37
 
42
38
  LOGGER = logging.getLogger("orbi.cli")
43
39
 
@@ -194,6 +190,15 @@ def command_add(config: config_domain.RunnerConfig, args, parser) -> int:
194
190
  return 0
195
191
 
196
192
 
193
+ def command_draft(config: config_domain.RunnerConfig, args, parser) -> int:
194
+ """Draft one request into deliverable Issues, or create the draft."""
195
+ return draft_cli.run_draft(
196
+ config, _selected_repo(config, args, parser),
197
+ request=args.request, session_dir=args.session_dir,
198
+ create=args.create,
199
+ )
200
+
201
+
197
202
  def command_suggest(config: config_domain.RunnerConfig, args, parser) -> int:
198
203
  repo = _selected_repo(config, args, parser)
199
204
  return suggest.run_suggest(
@@ -202,45 +207,6 @@ def command_suggest(config: config_domain.RunnerConfig, args, parser) -> int:
202
207
  )
203
208
 
204
209
 
205
- def command_session(config: config_domain.RunnerConfig, args, parser) -> int:
206
- path = find_session_file(config.repo_dir)
207
- if path is None:
208
- print(
209
- f"no pi session under {config.repo_dir / '.worktrees'}: "
210
- "no Pi is running",
211
- file=sys.stderr,
212
- )
213
- return 1
214
- if not args.follow:
215
- if args.pretty:
216
- with path.open("r", encoding="utf-8") as handle:
217
- for line in handle:
218
- line = line.strip()
219
- if not line:
220
- continue
221
- try:
222
- record = json.loads(line)
223
- except json.JSONDecodeError:
224
- continue
225
- if isinstance(record, dict):
226
- print(format_session_line(record))
227
- else:
228
- print(path)
229
- return 0
230
- for line in follow_session_file(path):
231
- if args.pretty:
232
- try:
233
- record = json.loads(line)
234
- except json.JSONDecodeError:
235
- continue
236
- if isinstance(record, dict):
237
- print(format_session_line(record))
238
- else:
239
- print(line)
240
- sys.stdout.flush()
241
- return 0
242
-
243
-
244
210
  def command_install_units(config: config_domain.RunnerConfig, args,
245
211
  parser) -> int:
246
212
  print(install_units_command(config, args.installed_dir))
@@ -375,6 +341,7 @@ def command_status(config: config_domain.RunnerConfig, args, parser) -> int:
375
341
  COMMAND_HANDLERS = {
376
342
  "add": command_add,
377
343
  "suggest": command_suggest,
344
+ "draft": command_draft,
378
345
  "status": command_status,
379
346
  "session": command_session,
380
347
  "install-units": command_install_units,
@@ -13,7 +13,7 @@ import argparse
13
13
  import os
14
14
  from pathlib import Path
15
15
 
16
- from orbi import __version__, cli_ticket_command, notify, suggest
16
+ from orbi import __version__, cli_ticket_command, draft_cli, notify, suggest
17
17
 
18
18
 
19
19
  def build_parser(description: str) -> argparse.ArgumentParser:
@@ -24,8 +24,7 @@ def build_parser(description: str) -> argparse.ArgumentParser:
24
24
  )
25
25
  parser = argparse.ArgumentParser(description=description, parents=[common])
26
26
  parser.add_argument(
27
- "--version", action="version",
28
- version=f"orbi {__version__}",
27
+ "--version", action="version", version=f"orbi {__version__}",
29
28
  )
30
29
  # The subcommand is OPTIONAL — with no subcommand the
31
30
  # installed CLI runs one Runner tick (the systemd ExecStart is the
@@ -43,6 +42,7 @@ def build_parser(description: str) -> argparse.ArgumentParser:
43
42
  help="source repo (default: first configured source)",
44
43
  )
45
44
  suggest.register_cli(subparsers, common)
45
+ draft_cli.register_cli(subparsers, common)
46
46
  status_parser = subparsers.add_parser(
47
47
  "status", parents=[common],
48
48
  help="show every active delivery with attributed local activity, "