orbi-cli 0.7.26__tar.gz → 0.7.27__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.
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/PKG-INFO +1 -1
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/pyproject.toml +1 -1
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/__init__.py +1 -1
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/config.py +10 -3
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/example_config.toml +2 -1
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/runner_health.py +19 -15
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi_cli.egg-info/PKG-INFO +1 -1
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_ci_workflow.py +45 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_runner_config.py +17 -2
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_runner_health.py +46 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/LICENSE +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/README.md +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/docs/licenses/sustainable-use-license.md +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/setup.cfg +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/base_ci_red.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/blocked_comment.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/branch_reclaim.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/check_permission.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/checks.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/claim.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/clarify.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli_commands.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli_doctor.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli_parser.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli_source.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli_status.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/cli_ticket_command.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/comment_kind.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/comment_trust.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/criteria_command.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/delivery_comment.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/delivery_labels.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/delivery_scene.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/engine_source.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/extensions/clarify_verdict.ts +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/failure.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/failure_report.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/gh_response.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/git_identity.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/git_transport.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/github.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/github_feedback.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/gitops.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/human_review.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/journal.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/language.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/language_terms.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/launchd_deploy.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/merge_exec.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/merge_gate.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/merge_handoff.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/milestone.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/milestone_command.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/notify.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_activity.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_command.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_idle.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_process.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_recovery.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_session.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pi_stream_log.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pilot_setup.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pilot_slots.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/pr_verification.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/progress.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/progress_display.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/progress_outcome.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/progress_summary.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release_closeout.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release_comments.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release_declaration.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release_git.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release_notes.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/release_run.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/repo_config.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/resume_scan.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/resume_verification.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/review_merge.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/review_rounds.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/review_verdict.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/run_state.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/runner.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/runner_marker.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/runner_source.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/scene.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/scheduler.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/scheduler_units.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/session_command.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/setup_checks.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/setup_config.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/source_pool.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/split_command.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/status_observe.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/suggest.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/systemd_deploy.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/ticket_command.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi/user_summary.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi_cli.egg-info/SOURCES.txt +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi_cli.egg-info/dependency_links.txt +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi_cli.egg-info/entry_points.txt +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/src/orbi_cli.egg-info/top_level.txt +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_agents_md.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_apply_label_patch.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_base_branch_failure.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_base_ci_red.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_blocked_comment.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_bootstrap_adapters.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_bootstrap_delivery.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_bootstrap_pi.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_bootstrap_preflight.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_bootstrap_release.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_bootstrap_runner.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_branch_reclaim.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_check_permission.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_ci_failure_issue_workflow.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_ci_failure_triage.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_ci_macos_workflow.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_clarify.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_claude_plugin.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_cli_golden.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_cli_install.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_cli_milestone.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_cli_packaging.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_cli_source.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_cli_ticket_commands.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_command_receipt_contract.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_comment_identity.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_comment_readers_contract.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_comment_trust.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_concurrency_e2e.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_constitution.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_coverage_gate.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_criteria_command.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_deliver_pr_fakes.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_delivery_branch_delete.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_delivery_labels.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_delivery_scene.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docker_docs.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docker_entrypoint.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docker_image_workflow.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_i18n.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_issue_shapes.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_labels.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_mermaid.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_releases.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_single_source.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_docs_site.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_engine_source.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_failure.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_failure_report.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_fix_needed_loop.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_gh_read_retry.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_gh_response.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_git_base_smoke.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_git_merge_smoke.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_git_network_retry.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_git_transport.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_github.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_github_fakes.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_gitops.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_gitops_fakes.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_human_review.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_import_graph.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_install_sh.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_issue_1367.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_issue_461.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_issue_template_config.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_journal.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_journal_events.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_launchd_deploy.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_license.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_merge_exec_extraction.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_message_language.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_milestone_command.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_notify.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_ops_e2e.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_orbi.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_orbi_dashboard.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_orbi_exporter.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_patch_ratchet.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pi_activity.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pi_command.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pi_extensions.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pi_provider_templates.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pi_recovery.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pi_session.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pilot_setup.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pilot_slots.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pr_issue_link_workflow.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_pr_verification.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_prerequisite_check.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_progress.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_progress_wiring.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_prompt_contract.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_public_contracts.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_public_helpers.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_publish_workflow.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_release_docs_workflow.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_release_extraction.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_release_ticket_templates.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_repo_config.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_resume_continue_e2e.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_resume_e2e.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_resume_pr.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_review_merge.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_review_verdict.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_run_artifacts.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_run_id_e2e.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_run_id_fixture.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_runner_source_freshness.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_scene.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_scheduler.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_seam.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_setup_output_golden.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_size_ratchet.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_split_command.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_src_layout.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_status_observe.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_steering_review.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_suggest.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_suite_hygiene.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_systemd_deploy.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_systemd_timer.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_ticket_command.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_user_acceptance_contract.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_user_summary.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/tests/test_versioned_comment_block.py +0 -0
- {orbi_cli-0.7.26 → orbi_cli-0.7.27}/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.
|
|
3
|
+
Version: 0.7.27
|
|
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.
|
|
47
|
+
version = "0.7.27"
|
|
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"
|
|
@@ -401,9 +401,16 @@ def load_config(path: Path, *, check_provider_api_keys: bool = True,
|
|
|
401
401
|
# Runner-self health alert routing: the orbi repo that
|
|
402
402
|
# receives the watchdog's crash_loop / stale_pickup Issues. Absent ->
|
|
403
403
|
# None (the Runner derives the orbi repo from the deploy home's git
|
|
404
|
-
# origin
|
|
405
|
-
#
|
|
406
|
-
|
|
404
|
+
# origin when it detects something); a string is kept verbatim — an
|
|
405
|
+
# explicit empty string turns alert FILING off while the detection and
|
|
406
|
+
# its `health_degraded` journal event stay (Issue #1985), any other
|
|
407
|
+
# value is the `owner/repo` the alert is filed in (fork/private
|
|
408
|
+
# deployments). A non-string fails the load fast.
|
|
409
|
+
health_alert_repo = data.get("health_alert_repo")
|
|
410
|
+
if health_alert_repo is not None and not isinstance(
|
|
411
|
+
health_alert_repo, str,
|
|
412
|
+
):
|
|
413
|
+
raise ValueError("health_alert_repo must be a string")
|
|
407
414
|
repo_dir = _config_path(data.get("repo_dir", "."), base)
|
|
408
415
|
# Deployment home: the orbi source checkout — the editable
|
|
409
416
|
# CLI install source, the systemd/ unit templates, labels.toml and the
|
|
@@ -213,7 +213,8 @@ max_concurrency = 1
|
|
|
213
213
|
# by `orbi doctor` under unmanaged_units.
|
|
214
214
|
# unit_name = "core"
|
|
215
215
|
# Runner health alerts (crash_loop/stale_pickup) go here when set; absent
|
|
216
|
-
# derives the Orbi repository from the deploy-home origin
|
|
216
|
+
# derives the Orbi repository from the deploy-home origin; "" turns alert
|
|
217
|
+
# Issues OFF while the detection and its health_degraded journal event stay.
|
|
217
218
|
# health_alert_repo = "OWNER/ORBI-REPO"
|
|
218
219
|
# Repository policy may override the ready label for this delivery source.
|
|
219
220
|
# dispatch_label = "ai-ready"
|
|
@@ -627,9 +627,13 @@ def _run_health_check_locked(config: RunnerConfig, *, run_command) -> list[str]:
|
|
|
627
627
|
# `health_alert_repo` override wins (fork/private deployments);
|
|
628
628
|
# otherwise the orbi repo is derived from the deploy home's git
|
|
629
629
|
# origin. Undeterminable -> log and skip (bypass: never guess a
|
|
630
|
-
# repo, never file the alert in the delivery repo).
|
|
630
|
+
# repo, never file the alert in the delivery repo). An explicit
|
|
631
|
+
# empty string (Issue #1985) turns alert FILING off: no
|
|
632
|
+
# alert-repository lookup at all, while the detection and its
|
|
633
|
+
# `health_degraded` event stay.
|
|
631
634
|
alert_repo = config.health_alert_repo
|
|
632
|
-
|
|
635
|
+
alerts_off = alert_repo == ""
|
|
636
|
+
if alert_repo is None:
|
|
633
637
|
alert_repo = orbi_repo_from_deploy_home(
|
|
634
638
|
config.deploy_home, run_command,
|
|
635
639
|
)
|
|
@@ -653,13 +657,7 @@ def _run_health_check_locked(config: RunnerConfig, *, run_command) -> list[str]:
|
|
|
653
657
|
"health_degraded", check="crash_loop", crashes=crashes,
|
|
654
658
|
window_minutes=CRASH_WINDOW_MINUTES, kind=kind,
|
|
655
659
|
)
|
|
656
|
-
if
|
|
657
|
-
event(
|
|
658
|
-
"health_alert_repo_undetermined",
|
|
659
|
-
level=logging.WARNING, check="crash_loop",
|
|
660
|
-
crashes=crashes,
|
|
661
|
-
)
|
|
662
|
-
else:
|
|
660
|
+
if alert_repo:
|
|
663
661
|
detail = (
|
|
664
662
|
f"service crashed {crashes} times in the last "
|
|
665
663
|
f"{CRASH_WINDOW_MINUTES} minutes"
|
|
@@ -676,6 +674,12 @@ def _run_health_check_locked(config: RunnerConfig, *, run_command) -> list[str]:
|
|
|
676
674
|
dispatchable=(kind == "bug"),
|
|
677
675
|
)
|
|
678
676
|
alerts.append("crash_loop")
|
|
677
|
+
elif not alerts_off:
|
|
678
|
+
event(
|
|
679
|
+
"health_alert_repo_undetermined",
|
|
680
|
+
level=logging.WARNING, check="crash_loop",
|
|
681
|
+
crashes=crashes,
|
|
682
|
+
)
|
|
679
683
|
# 2. Repeated same-fingerprint run failures (#246 scene).
|
|
680
684
|
for finding in repeated_failure_findings(state):
|
|
681
685
|
key = (
|
|
@@ -748,12 +752,7 @@ def _run_health_check_locked(config: RunnerConfig, *, run_command) -> list[str]:
|
|
|
748
752
|
time.time() - state["last_pickup_ts"],
|
|
749
753
|
),
|
|
750
754
|
)
|
|
751
|
-
if
|
|
752
|
-
event(
|
|
753
|
-
"health_alert_repo_undetermined",
|
|
754
|
-
level=logging.WARNING, check="stale_pickup",
|
|
755
|
-
)
|
|
756
|
-
else:
|
|
755
|
+
if alert_repo:
|
|
757
756
|
create_health_issue(
|
|
758
757
|
alert_repo, "stale_pickup",
|
|
759
758
|
(
|
|
@@ -764,6 +763,11 @@ def _run_health_check_locked(config: RunnerConfig, *, run_command) -> list[str]:
|
|
|
764
763
|
run_command=run_command,
|
|
765
764
|
)
|
|
766
765
|
alerts.append("stale_pickup")
|
|
766
|
+
elif not alerts_off:
|
|
767
|
+
event(
|
|
768
|
+
"health_alert_repo_undetermined",
|
|
769
|
+
level=logging.WARNING, check="stale_pickup",
|
|
770
|
+
)
|
|
767
771
|
finally:
|
|
768
772
|
save_health_state(state_path, state)
|
|
769
773
|
return alerts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: orbi-cli
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.27
|
|
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
|
|
@@ -496,6 +496,51 @@ def test_ci_workflow_pins_the_mintlify_cli_version():
|
|
|
496
496
|
)
|
|
497
497
|
|
|
498
498
|
|
|
499
|
+
# Issue #1983: `mint@4.2.890` validates through @mintlify/previewing's
|
|
500
|
+
# `is-online@10` connectivity probe: three got requests raced under a
|
|
501
|
+
# `pTimeout`, and when the timeout fired it called `.cancel()` on every
|
|
502
|
+
# probe — got's p-cancelable throws "The `onCancel` handler was attached
|
|
503
|
+
# after the promise settled." for a probe that had already settled, inside
|
|
504
|
+
# the `.catch()` handler, so the throw is uncaught and kills the CLI
|
|
505
|
+
# (2026-10-28, run 40708890646: one slow probe on a GitHub runner). The
|
|
506
|
+
# newer @mintlify/previewing pulls no `is-online`/`got` probe at all: its
|
|
507
|
+
# own `local-preview/is-online.js` uses native `fetch` under an
|
|
508
|
+
# AbortController and `catch { return false }`, so a slow probe can no
|
|
509
|
+
# longer terminate the process. `mint@4.2.1157` is the pinned version of
|
|
510
|
+
# that fixed tree; the pin is a FLOOR (bumping further is the deliberate
|
|
511
|
+
# one-line change #744 describes, a downgrade comes back to the crash).
|
|
512
|
+
MINTLIFY_MIN_VERSION = (4, 2, 1157)
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
def test_ci_workflow_pins_the_mintlify_cli_without_the_fragile_connectivity_probe():
|
|
516
|
+
"""Issue #1983: the docs build smoke must not run a Mintlify CLI whose
|
|
517
|
+
`validate` ships the p-cancelable/is-online probe that aborts the whole
|
|
518
|
+
process when a connectivity probe is slow. A slow probe is runner
|
|
519
|
+
weather, not a docs defect, and it turned `main` red."""
|
|
520
|
+
commands = step_commands(steps_of(load_workflow()))
|
|
521
|
+
installs = [
|
|
522
|
+
command for command in commands
|
|
523
|
+
if re.search(r"npm (i|install)( -g)? mint\b", command)
|
|
524
|
+
]
|
|
525
|
+
assert installs, (
|
|
526
|
+
"CI must install the official Mintlify CLI (mint), "
|
|
527
|
+
f"steps run: {commands!r}"
|
|
528
|
+
)
|
|
529
|
+
for command in installs:
|
|
530
|
+
match = re.search(r"\bmint@([0-9]+)\.([0-9]+)\.([0-9]+)\b", command)
|
|
531
|
+
assert match, (
|
|
532
|
+
"the Mintlify CLI install must pin an exact version "
|
|
533
|
+
f"(npm install -g mint@<semver>, Issue #744), got: {command!r}"
|
|
534
|
+
)
|
|
535
|
+
pinned = tuple(int(part) for part in match.groups())
|
|
536
|
+
assert pinned >= MINTLIFY_MIN_VERSION, (
|
|
537
|
+
"the pinned Mintlify CLI must be at least "
|
|
538
|
+
f"{'.'.join(str(part) for part in MINTLIFY_MIN_VERSION)}: older "
|
|
539
|
+
"versions ship the is-online/got connectivity probe that crashes "
|
|
540
|
+
f"`mint validate` on a slow probe (Issue #1983), got: {command!r}"
|
|
541
|
+
)
|
|
542
|
+
|
|
543
|
+
|
|
499
544
|
def test_testing_documents_remote_ci():
|
|
500
545
|
"""Issue #241: the remote CI contract lives in docs/testing.mdx
|
|
501
546
|
(the README homepage keeps only the summary plus the docs link):
|
|
@@ -429,14 +429,29 @@ def test_load_config_health_alert_repo_default_and_override(tmp_path):
|
|
|
429
429
|
"fork-owner/orbi-fork"
|
|
430
430
|
|
|
431
431
|
|
|
432
|
-
def
|
|
432
|
+
def test_load_config_keeps_empty_health_alert_repo_as_off(tmp_path):
|
|
433
|
+
"""Issue #1985: an explicit empty string turns health-alert FILING off
|
|
434
|
+
while the detection stays; it loads instead of failing the whole
|
|
435
|
+
config."""
|
|
433
436
|
config_path = tmp_path / "orbi.toml"
|
|
434
437
|
config_path.write_text(
|
|
435
438
|
'source_repos = ["owner/repo"]\nhealth_alert_repo = ""\n',
|
|
436
439
|
encoding="utf-8",
|
|
437
440
|
)
|
|
441
|
+
assert config_domain.load_config(config_path).health_alert_repo == ""
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
def test_load_config_rejects_non_string_health_alert_repo(tmp_path):
|
|
445
|
+
"""Issue #1985: the two documented values are "" (off) and
|
|
446
|
+
"owner/repo" (route it there) — anything that is not a string is a
|
|
447
|
+
misconfiguration and fails the load fast."""
|
|
448
|
+
config_path = tmp_path / "orbi.toml"
|
|
449
|
+
config_path.write_text(
|
|
450
|
+
'source_repos = ["owner/repo"]\nhealth_alert_repo = 42\n',
|
|
451
|
+
encoding="utf-8",
|
|
452
|
+
)
|
|
438
453
|
with pytest.raises(
|
|
439
|
-
ValueError, match="health_alert_repo must be a
|
|
454
|
+
ValueError, match="health_alert_repo must be a string",
|
|
440
455
|
):
|
|
441
456
|
config_domain.load_config(config_path)
|
|
442
457
|
|
|
@@ -1151,6 +1151,52 @@ def test_health_alert_repo_override_wins(tmp_path):
|
|
|
1151
1151
|
assert fake.commands("remote get-url origin") == []
|
|
1152
1152
|
|
|
1153
1153
|
|
|
1154
|
+
def test_empty_health_alert_repo_keeps_detection_without_filing(tmp_path, caplog):
|
|
1155
|
+
"""Issue #1985: `health_alert_repo = ""` turns alert FILING off — the
|
|
1156
|
+
crash loop is still detected and journaled, but no alert-repository
|
|
1157
|
+
lookup runs and no alert Issue is filed."""
|
|
1158
|
+
write_state(tmp_path, {"runs": [], "last_pickup_ts": time.time(),
|
|
1159
|
+
"alerted": []})
|
|
1160
|
+
fake = FakeRunCommand({
|
|
1161
|
+
"journalctl --user -u orbi@1.service": THREE_CRASH_JOURNAL,
|
|
1162
|
+
"journalctl --user -u orbi@2.service": "",
|
|
1163
|
+
})
|
|
1164
|
+
with caplog.at_level("INFO"):
|
|
1165
|
+
alerts = runner_health.run_health_check(
|
|
1166
|
+
make_config(tmp_path, health_alert_repo=""), run_command=fake,
|
|
1167
|
+
)
|
|
1168
|
+
assert alerts == []
|
|
1169
|
+
assert "health_degraded check=crash_loop" in caplog.text
|
|
1170
|
+
assert fake.commands("gh issue") == []
|
|
1171
|
+
assert fake.commands("remote get-url origin") == []
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
def test_stale_pickup_empty_health_alert_repo_detects_without_filing(
|
|
1175
|
+
tmp_path, caplog,
|
|
1176
|
+
):
|
|
1177
|
+
"""Issue #1985: a stale pickup with `health_alert_repo = ""` is still
|
|
1178
|
+
detected (the ready-queue probe on the delivery repo stays) and
|
|
1179
|
+
journaled, but no alert-repository lookup and no alert Issue happen."""
|
|
1180
|
+
write_state(tmp_path, {"runs": [],
|
|
1181
|
+
"last_pickup_ts": time.time() - 48 * 3600,
|
|
1182
|
+
"alerted": []})
|
|
1183
|
+
fake = FakeRunCommand({
|
|
1184
|
+
"journalctl --user -u orbi@1.service": "",
|
|
1185
|
+
"journalctl --user -u orbi@2.service": "",
|
|
1186
|
+
"--label ai-ready": json.dumps([{"number": 7}]),
|
|
1187
|
+
})
|
|
1188
|
+
with caplog.at_level("INFO"):
|
|
1189
|
+
alerts = runner_health.run_health_check(
|
|
1190
|
+
make_config(tmp_path, health_alert_repo=""), run_command=fake,
|
|
1191
|
+
)
|
|
1192
|
+
assert alerts == []
|
|
1193
|
+
assert "health_degraded check=stale_pickup" in caplog.text
|
|
1194
|
+
# The detection probe stays: the ai-ready queue on the delivery repo.
|
|
1195
|
+
assert len(fake.commands("--label ai-ready")) == 1
|
|
1196
|
+
assert fake.commands("gh issue create") == []
|
|
1197
|
+
assert fake.commands("remote get-url origin") == []
|
|
1198
|
+
|
|
1199
|
+
|
|
1154
1200
|
def test_undeterminable_alert_repo_skips_the_issue(tmp_path, caplog):
|
|
1155
1201
|
"""Issue #345: when the orbi repo cannot be determined the alert is
|
|
1156
1202
|
skipped (bypass) — never filed in the delivery repo, never guessed."""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|