gitgrip 2.0.0a7__tar.gz → 2.0.0a8__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.
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/PKG-INFO +49 -12
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/README.md +48 -11
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gitgrip.egg-info/PKG-INFO +49 -12
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gitgrip.egg-info/SOURCES.txt +13 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gitgrip.egg-info/entry_points.txt +1 -0
- gitgrip-2.0.0a8/gr2/PLATFORM_ADAPTER_CHANGELOG.md +67 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/activate.py +2 -6
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/introspection.py +2 -6
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/objects.py +14 -77
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/refs.py +3 -12
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/app.py +91 -48
- gitgrip-2.0.0a8/gr2/python_cli/approvals.py +302 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/check_records.py +7 -10
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/clone_exec.py +2 -2
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/context.py +2 -1
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/defaults.py +5 -5
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/git_review.py +2 -5
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/gitops.py +137 -66
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/gr_resolver.py +67 -14
- gitgrip-2.0.0a8/gr2/python_cli/gr_shadow.py +101 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/grip.py +89 -65
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/grip_cli.py +4 -4
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/hooks.py +3 -5
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/lane_defaults.py +2 -4
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/lane_downstream.py +15 -2
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/launch_exec.py +58 -6
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/merge_gate.py +34 -25
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/merge_verification.py +2 -7
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/open_gr_review.py +4 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/platform.py +5 -1
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/pr.py +9 -1
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/prune.py +2 -8
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_ephemeral.py +5 -10
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_field_tree.py +3 -3
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_members.py +3 -3
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_rebind.py +10 -9
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_records.py +2 -4
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_run.py +6 -10
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/pyproject.toml +5 -2
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_api_dump.py +5 -1
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_defaults_from_repo.py +4 -4
- gitgrip-2.0.0a8/tests/test_gitops_shared.py +334 -0
- gitgrip-2.0.0a8/tests/test_gr_installed_wheel.py +70 -0
- gitgrip-2.0.0a8/tests/test_gr_resolved_cleared.py +14 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_gr_resolver_conformance.py +67 -9
- gitgrip-2.0.0a8/tests/test_gr_shadow.py +149 -0
- gitgrip-2.0.0a8/tests/test_lane_probe_batch.py +134 -0
- gitgrip-2.0.0a8/tests/test_platform_adapter_changelog.py +115 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_platform_adapter_plugins.py +139 -54
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_review_subject.py +21 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_readme_verbs_exist.py +13 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_a4.py +7 -7
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_a4_v2.py +4 -4
- gitgrip-2.0.0a8/tests/test_review_approvals.py +752 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_migration.py +1 -1
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_native_store.py +1 -1
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_field_tree_reader_edges.py +1 -1
- gitgrip-2.0.0a8/tests/test_review_pin_stamp_names.py +57 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_reader_defaults.py +5 -5
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_remote_safety.py +122 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_subject.py +5 -5
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_transport.py +1 -1
- gitgrip-2.0.0a8/tests/test_review_vocabulary.py +66 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_root_option_verbs.py +1 -1
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sync_ssh_rewrite.py +6 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sync_status_probe.py +3 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_tmux_launch_runtime.py +102 -5
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_version_static.py +2 -2
- gitgrip-2.0.0a8/tests/test_vocabulary.py +115 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gitgrip.egg-info/dependency_links.txt +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gitgrip.egg-info/requires.txt +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gitgrip.egg-info/top_level.txt +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/__init__.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/api_core.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/__init__.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/agent_manifest.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/cross_repo.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/drivers.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/language_drivers.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/perf.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/trust.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/types.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/units.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/workspace_spec.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/__init__.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/cache_materialization_probe.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/concurrent_event_stress.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/concurrent_lease_stress.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/concurrent_workspace_cap_stress.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/contribution_protocol.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/cross_mode_lane_stress.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/jsonl_store.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/lane_workspace_prototype.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/layout_model_probe.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/propagation_daemon.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/propagation_state_machine.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/python_exec_playground.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/python_hook_runtime_playground.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/python_migration_playground.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/python_review_checkout_playground.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/python_spec_apply_playground.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/real_git_lane_materialization.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/real_git_playground.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/recall_lane_history.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/repo_maintenance_prototype.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/repo_transport_probe.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/__init__.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/__main__.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/add.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/approval_schema.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/branch.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/channel_bridge.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/commit.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/config.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/consent.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/ecosystems_python.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/env_exec.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/events.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/execops.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/exit_codes.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/failures.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/file_exec.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/gitinclude.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/lane_graph.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/lane_plugins.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/layout.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/migration.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/project_review.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/push.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_allocation.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_dispatch.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_runners.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/root_option.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/spec_apply.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/staging_cleanup.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/syncops.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/target.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/version.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/workspace_guidance.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/workspace_snapshot.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.approval.v1alpha1/approval.proto +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.approval.v1alpha1/descriptor_set.pb +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.check.v1alpha1/check.proto +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.check.v1alpha1/descriptor_set.pb +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.merge.v1alpha1/descriptor_set.pb +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.merge.v1alpha1/merge.proto +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.review.v1alpha1/descriptor_set.pb +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.review.v1alpha1/review.proto +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/gr2-materialization-plan-v1.schema.json +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/gr2-workspace-spec-v1.schema.json +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2_overlay/__init__.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/setup.cfg +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_add.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_agent_manifest_overlay_source.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_api_core_seam.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_app_event_outcomes.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_apply_convergence.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_apply_gr1_sibling_adoption.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_approval_schema.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_branch.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_break_17_unit_path_containment.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_break_18_gr1_sibling_units.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_channel_bridge.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_cli_adapter_error_boundary.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_cli_shape_witnesses.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_clone_materialization.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_commit.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_config_base_path_guard.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_config_overlay.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_conftest_git_isolation.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_context_resolver.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_contribution_protocol.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_deprecation_registry.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_ecosystems_python.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_ensure_lane_checkout_reference_clone.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_env_materialization.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_event_log_integrity.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_event_outcome_policy.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_events.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_events_torn_line.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_exec_apostrophe_and_oserror.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_exec_single_string_and_materialize_plan.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_execops.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_failure_event_outcome.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_field_tree_name.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_first_five_minutes.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_foreground_launch_runtime.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_git_review.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_gitinclude_compiler.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_gr1_first_run_guidance.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_gr2_packaging.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_gr2_review_receipt.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_grip_cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_grip_hardening.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_grip_snapshot.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_grip_toml_schema_v1.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_hook_events.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_hook_hardening.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_hooks_consent.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_hooks_group_names.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_jsonl_store.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_checkout_root.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_create_defaults.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_create_fork_base_cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_create_refusal_leaves_nothing.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_create_refuses_own_branch.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_downstream.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_downstream_run.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_enter_hook_warnings.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_exit_keeps_dirty_work.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_graph.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_lease_show_json.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_lifecycle_safety.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_plugins.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_probe.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_repo_paths_and_all_skipped.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_roles.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_show_name.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_store_path_pins.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_toml_serialization.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_launch_primitive.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_layout_census.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_linked_review_receipts.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_m2_overlay_hindsight.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_m2_overlay_mem0.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_m2_overlay_zep.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_materialization_plan_contract.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_materialize_pin.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_member_working_root_checkout_materialize.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_merge_evidence.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_merge_parent_verification.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_migration.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_migration_overlay_compatibility.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_migration_unadopted_notice.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_native_store_gitinclude.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_native_store_review_record_probes.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_no_bare_python_cli_imports.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_null_current_lane_refusal.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_open_gr_enter.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_open_project_refusal_reason_cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_outbox_ack_after_effect.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_acceptance.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_activate.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_cli_wiring.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_composition_merge.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_cross_repo_atomic_apply.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_cross_repo_perf_gate.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_cross_repo_rollback.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_driver_registry.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_introspection.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_multi_stack.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_object_encoding.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_perf_gates.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_python_driver.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_tier_b_encoding.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_tier_b_perf_gates.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_tier_b_repo_state.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_tier_b_staging_discipline.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_trust_model.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_workspace_spec.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_events.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_group_legibility.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_merge_head_pin.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_merge_method.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_merge_missing_target.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_merge_partial_failure.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_view.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_project_file_materialization.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_project_review_range_reconstruction.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_project_review_three_repo.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_projection_tracked_dest.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_propagation_contribution.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_propagation_daemon.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_propagation_state_machine.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_prune.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_push.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_python_group_install.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_record_schema_copies.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_remote_check_records.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_repo_path_read_through.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_repo_status_linked_worktree.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_repo_status_schema_version.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_repo_status_symlinked_git_dir.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_a4_v3.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_allocation_recovery.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_ansi_parse.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_b3_reader_alignment.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_author.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_fork_base.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_from_range.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_root_refs.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_verify.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_check_name.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_close_gr.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_close_keeps_local_work.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_context_defaults.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_context_witnesses.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_create_project_cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_dispatch.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_ephemeral.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_events.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_field_tree.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_field_tree_readers.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_install_hint.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_merge_gate.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_merge_gate_lost_ack.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_open_lane.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_pr_marker_context.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_rebind.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_receipt_cleanup.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_ref_v1_migration.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_ref_v1_reader.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_ref_v1_writer.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_context.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_dependency_order.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_import_isolation.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_integrity_recheck.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_multi_repo.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_plugin_order.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_rerun_and_refusal_receipt.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_runners.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_v1_format_guard.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_verify_inside.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_rmtree_or_refuse.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_selected_workspace_commit.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_single_repo_cwd_refusal.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_snapshot_id_prefix_resolution.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_spec_apply_event_outcomes.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_spec_declaration_ref_pin.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sprint21_sync_platform.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_staging_cleanup.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_break_attempts.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_checkout_atomicity.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_commit_noop.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_declared_members.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_git_native_smoke.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_init_branch_inference.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_log_adoption_boundary.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_member_path_hygiene.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_member_state.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_migrate_branch_inference.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_moved_workspace_guard.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_status_values.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_verb_rename.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_verb_witnesses.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_submodule_member_predicate.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_superproject_import.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sync_event_outcomes.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sync_fast_forward.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sync_fetch.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sync_seed_local.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_target.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_unit_abort.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_unit_apply.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_unit_apply_dry_run.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_unit_manifest_schema.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_unit_propose.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_unit_topological_apply.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_validate_repo_path_conflict.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_version_identity.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_convert_clone.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_edit_lease_cap.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_identity_boundary.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_init_from_topology.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_init_local_repos.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_root_defaults.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_root_nearest_marker.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_snapshot.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gitgrip
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0a8
|
|
4
4
|
Summary: Workspace layer for multi-repo work: workspaces, isolated lanes, and one grouped review per slice
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -21,7 +21,7 @@ Requires-Dist: packaging>=22; extra == "dev"
|
|
|
21
21
|
## Install
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
uv tool install --pre gitgrip # the PyPI package is "gitgrip";
|
|
24
|
+
uv tool install --pre gitgrip # the PyPI package is "gitgrip"; it installs `gr` and `gr2`
|
|
25
25
|
gr2 --version
|
|
26
26
|
```
|
|
27
27
|
|
|
@@ -37,7 +37,9 @@ gr2 --version
|
|
|
37
37
|
|
|
38
38
|
Already installed 1.5.0 or 1.5.1? The install commands above leave it in place, because an installed version already satisfies them. Upgrade explicitly: `uv tool upgrade --prerelease allow gitgrip`, or `pip install --pre -U gitgrip`. To run unreleased development code instead, install from a checkout: `pip install -e gr2/` from the repository root.
|
|
39
39
|
|
|
40
|
-
The
|
|
40
|
+
The package installs two commands. `gr2` always runs gr2. `gr` picks by the nearest workspace marker: in a gr1 workspace (`.gitgrip`) it runs gr1, and anywhere else, including outside any workspace, it runs gr2.
|
|
41
|
+
|
|
42
|
+
The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`, as `gr` and `gitgrip`. You can have both installed. Whichever `gr` comes first on `PATH` answers: gitgrip 1.5 and earlier always run gr1, so if it comes first, type `gr2` for gr2 (`gr2` says so once). In a gr1 workspace, this package's `gr` runs gr1 through `gitgrip`. With no gr1 installed, it serves a workspace already moved with `gr2 workspace migrate-gr1`, and in one not yet moved it says how to move it.
|
|
41
43
|
|
|
42
44
|
## First five minutes
|
|
43
45
|
|
|
@@ -108,13 +110,45 @@ Not there yet:
|
|
|
108
110
|
| `sync` | status, run |
|
|
109
111
|
| `pr` | create, status, checks, merge, view |
|
|
110
112
|
| `check` | run, show |
|
|
111
|
-
| `review` | open, close, checkout-pr, run, check,
|
|
113
|
+
| `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
|
|
112
114
|
| `exec` | status, run |
|
|
113
115
|
| `repo` | status, projection-run |
|
|
114
116
|
| `hooks` | trust, revoke, status, show, run |
|
|
115
117
|
| `store` | init, commit, check, push, status, log, diff, checkout, materialize, migrate, migrate-reviews |
|
|
116
118
|
| `target`, `config` | stored PR target; config overlays |
|
|
117
119
|
|
|
120
|
+
`review bind`, `review approve` and `review rebind` remain as aliases of `pin`, `stamp` and `repin`.
|
|
121
|
+
|
|
122
|
+
The words these commands use (lane, pin, stamp, repin, gate, review) are defined in [docs/GLOSSARY.md](docs/GLOSSARY.md).
|
|
123
|
+
|
|
124
|
+
## Stamps (unsigned approvals)
|
|
125
|
+
|
|
126
|
+
Inside a workspace with one pinned review matching every member's current head,
|
|
127
|
+
a reviewer stamps it as the workspace's Git `user.name`:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
gr2 review stamp
|
|
131
|
+
gr2 review merge
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
The author recorded by the pin, and anyone who authored a commit in its range,
|
|
135
|
+
cannot stamp it. A stamp records an approval; approver names are self-declared and receipts say `signed: false`.
|
|
136
|
+
Repeated stamps by the same name count once. A moved head needs a new pin
|
|
137
|
+
and fresh stamps. Signing is not implemented by these commands.
|
|
138
|
+
|
|
139
|
+
The workspace's `grip.toml` sets the number required before merging:
|
|
140
|
+
|
|
141
|
+
```toml
|
|
142
|
+
[approvals]
|
|
143
|
+
required = 2
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
The default is zero; `review merge --approvals N` can raise the count for that
|
|
147
|
+
run, but cannot lower the workspace policy. With zero required, the merge gate
|
|
148
|
+
skips approval counting. When approvals are required, broken records or different
|
|
149
|
+
chain tips across member remotes refuse before this run pushes a merge. After a refused stamp, rerun
|
|
150
|
+
`review stamp` to read the current chain and retry with a lease.
|
|
151
|
+
|
|
118
152
|
## Overlay substrate
|
|
119
153
|
|
|
120
154
|
gr2 also carries the config-overlay substrate (capture, compose, and materialize configuration layers over a workspace): see [docs/OVERLAY-SUBSTRATE.md](docs/OVERLAY-SUBSTRATE.md).
|
|
@@ -133,17 +167,17 @@ Migration: use `gr2 review check` for compiled review requirements. `review requ
|
|
|
133
167
|
remains a hidden alias with a warning on stderr until beta. Both report `satisfied`
|
|
134
168
|
in the same JSON payload, and a missing reviewer remains a reported status with exit 0.
|
|
135
169
|
|
|
136
|
-
A bare `gr2 review open <workspace>` uses the workspace's sole review
|
|
170
|
+
A bare `gr2 review open <workspace>` uses the workspace's sole pinned review. Its default directory is `<workspace>.review/<sha8>` in the workspace's parent directory, and the command announces that path on stderr. Give `--lane-dir` to choose another location.
|
|
137
171
|
|
|
138
|
-
New
|
|
172
|
+
New pinned reviews record the author's Git `user.name` from the workspace root.
|
|
139
173
|
Set it with `git config user.name 'Your Name'` there if Git has no configured name.
|
|
140
|
-
`review show --json` and `review verify --json` include this author; older
|
|
174
|
+
`review show --json` and `review verify --json` include this author; older pinned reviews
|
|
141
175
|
remain readable without an author field, and reading them does not invent one.
|
|
142
176
|
|
|
143
177
|
|
|
144
178
|
## Transfer a native review
|
|
145
179
|
|
|
146
|
-
Publish an existing
|
|
180
|
+
Publish an existing pinned review and receive it in another native workspace:
|
|
147
181
|
|
|
148
182
|
```bash
|
|
149
183
|
gr2 review publish gr:<full-review-id> --remote https://example.org/workspace.git
|
|
@@ -164,7 +198,7 @@ refused without falling back to context.
|
|
|
164
198
|
Publish transfers only that review ref and confirms its returned target. Receive
|
|
165
199
|
compares both the advertised and actual fetched raw target with the expected ID,
|
|
166
200
|
requires a commit and recomputable review content, then creates the canonical
|
|
167
|
-
local
|
|
201
|
+
local review ref. A valid same-ID receive is idempotent. A conflicting existing ref
|
|
168
202
|
is refused. Object downloads may remain after refusal. The owned temporary ref
|
|
169
203
|
is removed separately, and cleanup failure is reported without replacing a
|
|
170
204
|
primary failure.
|
|
@@ -183,6 +217,9 @@ or cleanup authority. Opening a reconstruction remains a separate operation.
|
|
|
183
217
|
External packages can expose a zero-argument factory through the
|
|
184
218
|
`gr2.platform_adapters` entry-point group. See [the adapter contract](docs/PR-LIFECYCLE.md#51-adapter-protocol-and-capabilities)
|
|
185
219
|
for registration, optional operation capabilities and merge head-pin requirements.
|
|
220
|
+
What changed in that protocol, release by release, ships in the package: read it from
|
|
221
|
+
an install with `importlib.resources.files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md"`,
|
|
222
|
+
or in this repository at [gr2/PLATFORM_ADAPTER_CHANGELOG.md](gr2/PLATFORM_ADAPTER_CHANGELOG.md).
|
|
186
223
|
Select the installed adapter with `gr2 pr create ... --platform NAME` on a
|
|
187
224
|
materialized lane. The bound-lane path currently pushes and returns its receipt.
|
|
188
225
|
|
|
@@ -225,13 +262,13 @@ failure at that commit. Concurrent writes union observations with bounded
|
|
|
225
262
|
compare-and-swap retries. An unmeasurable push acknowledgement is reported as
|
|
226
263
|
indeterminate unless a fresh remote read confirms the observation.
|
|
227
264
|
|
|
228
|
-
## Merge a
|
|
265
|
+
## Merge a pinned review into plain Git remotes
|
|
229
266
|
|
|
230
267
|
```sh
|
|
231
268
|
gr2 review merge
|
|
232
269
|
```
|
|
233
270
|
|
|
234
|
-
This merges the review
|
|
271
|
+
This merges the review pinned at the members' current heads, from their current branch, into the
|
|
235
272
|
branch on each remote that still sits at the reviewed base, and prints what it resolved. If several
|
|
236
273
|
branches sit there, it asks for `--into`. It merges only if every member's remote feature
|
|
237
274
|
branch is still the reviewed head, the target is still the reviewed base, and the exact-head check
|
|
@@ -243,7 +280,7 @@ Exit codes:
|
|
|
243
280
|
- 3: none merged (refused);
|
|
244
281
|
- 4: partial or unknown.
|
|
245
282
|
|
|
246
|
-
A review id, `--from` and `--into` override the defaults. Zero or several matching
|
|
283
|
+
A review id, `--from` and `--into` override the defaults. Zero or several matching pinned reviews, or members on
|
|
247
284
|
different branches, refuse and name the value to pass.
|
|
248
285
|
|
|
249
286
|
These records are attestations by writers trusted with remote access, not signed
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
uv tool install --pre gitgrip # the PyPI package is "gitgrip";
|
|
8
|
+
uv tool install --pre gitgrip # the PyPI package is "gitgrip"; it installs `gr` and `gr2`
|
|
9
9
|
gr2 --version
|
|
10
10
|
```
|
|
11
11
|
|
|
@@ -21,7 +21,9 @@ gr2 --version
|
|
|
21
21
|
|
|
22
22
|
Already installed 1.5.0 or 1.5.1? The install commands above leave it in place, because an installed version already satisfies them. Upgrade explicitly: `uv tool upgrade --prerelease allow gitgrip`, or `pip install --pre -U gitgrip`. To run unreleased development code instead, install from a checkout: `pip install -e gr2/` from the repository root.
|
|
23
23
|
|
|
24
|
-
The
|
|
24
|
+
The package installs two commands. `gr2` always runs gr2. `gr` picks by the nearest workspace marker: in a gr1 workspace (`.gitgrip`) it runs gr1, and anywhere else, including outside any workspace, it runs gr2.
|
|
25
|
+
|
|
26
|
+
The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`, as `gr` and `gitgrip`. You can have both installed. Whichever `gr` comes first on `PATH` answers: gitgrip 1.5 and earlier always run gr1, so if it comes first, type `gr2` for gr2 (`gr2` says so once). In a gr1 workspace, this package's `gr` runs gr1 through `gitgrip`. With no gr1 installed, it serves a workspace already moved with `gr2 workspace migrate-gr1`, and in one not yet moved it says how to move it.
|
|
25
27
|
|
|
26
28
|
## First five minutes
|
|
27
29
|
|
|
@@ -92,13 +94,45 @@ Not there yet:
|
|
|
92
94
|
| `sync` | status, run |
|
|
93
95
|
| `pr` | create, status, checks, merge, view |
|
|
94
96
|
| `check` | run, show |
|
|
95
|
-
| `review` | open, close, checkout-pr, run, check,
|
|
97
|
+
| `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
|
|
96
98
|
| `exec` | status, run |
|
|
97
99
|
| `repo` | status, projection-run |
|
|
98
100
|
| `hooks` | trust, revoke, status, show, run |
|
|
99
101
|
| `store` | init, commit, check, push, status, log, diff, checkout, materialize, migrate, migrate-reviews |
|
|
100
102
|
| `target`, `config` | stored PR target; config overlays |
|
|
101
103
|
|
|
104
|
+
`review bind`, `review approve` and `review rebind` remain as aliases of `pin`, `stamp` and `repin`.
|
|
105
|
+
|
|
106
|
+
The words these commands use (lane, pin, stamp, repin, gate, review) are defined in [docs/GLOSSARY.md](docs/GLOSSARY.md).
|
|
107
|
+
|
|
108
|
+
## Stamps (unsigned approvals)
|
|
109
|
+
|
|
110
|
+
Inside a workspace with one pinned review matching every member's current head,
|
|
111
|
+
a reviewer stamps it as the workspace's Git `user.name`:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
gr2 review stamp
|
|
115
|
+
gr2 review merge
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
The author recorded by the pin, and anyone who authored a commit in its range,
|
|
119
|
+
cannot stamp it. A stamp records an approval; approver names are self-declared and receipts say `signed: false`.
|
|
120
|
+
Repeated stamps by the same name count once. A moved head needs a new pin
|
|
121
|
+
and fresh stamps. Signing is not implemented by these commands.
|
|
122
|
+
|
|
123
|
+
The workspace's `grip.toml` sets the number required before merging:
|
|
124
|
+
|
|
125
|
+
```toml
|
|
126
|
+
[approvals]
|
|
127
|
+
required = 2
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The default is zero; `review merge --approvals N` can raise the count for that
|
|
131
|
+
run, but cannot lower the workspace policy. With zero required, the merge gate
|
|
132
|
+
skips approval counting. When approvals are required, broken records or different
|
|
133
|
+
chain tips across member remotes refuse before this run pushes a merge. After a refused stamp, rerun
|
|
134
|
+
`review stamp` to read the current chain and retry with a lease.
|
|
135
|
+
|
|
102
136
|
## Overlay substrate
|
|
103
137
|
|
|
104
138
|
gr2 also carries the config-overlay substrate (capture, compose, and materialize configuration layers over a workspace): see [docs/OVERLAY-SUBSTRATE.md](docs/OVERLAY-SUBSTRATE.md).
|
|
@@ -117,17 +151,17 @@ Migration: use `gr2 review check` for compiled review requirements. `review requ
|
|
|
117
151
|
remains a hidden alias with a warning on stderr until beta. Both report `satisfied`
|
|
118
152
|
in the same JSON payload, and a missing reviewer remains a reported status with exit 0.
|
|
119
153
|
|
|
120
|
-
A bare `gr2 review open <workspace>` uses the workspace's sole review
|
|
154
|
+
A bare `gr2 review open <workspace>` uses the workspace's sole pinned review. Its default directory is `<workspace>.review/<sha8>` in the workspace's parent directory, and the command announces that path on stderr. Give `--lane-dir` to choose another location.
|
|
121
155
|
|
|
122
|
-
New
|
|
156
|
+
New pinned reviews record the author's Git `user.name` from the workspace root.
|
|
123
157
|
Set it with `git config user.name 'Your Name'` there if Git has no configured name.
|
|
124
|
-
`review show --json` and `review verify --json` include this author; older
|
|
158
|
+
`review show --json` and `review verify --json` include this author; older pinned reviews
|
|
125
159
|
remain readable without an author field, and reading them does not invent one.
|
|
126
160
|
|
|
127
161
|
|
|
128
162
|
## Transfer a native review
|
|
129
163
|
|
|
130
|
-
Publish an existing
|
|
164
|
+
Publish an existing pinned review and receive it in another native workspace:
|
|
131
165
|
|
|
132
166
|
```bash
|
|
133
167
|
gr2 review publish gr:<full-review-id> --remote https://example.org/workspace.git
|
|
@@ -148,7 +182,7 @@ refused without falling back to context.
|
|
|
148
182
|
Publish transfers only that review ref and confirms its returned target. Receive
|
|
149
183
|
compares both the advertised and actual fetched raw target with the expected ID,
|
|
150
184
|
requires a commit and recomputable review content, then creates the canonical
|
|
151
|
-
local
|
|
185
|
+
local review ref. A valid same-ID receive is idempotent. A conflicting existing ref
|
|
152
186
|
is refused. Object downloads may remain after refusal. The owned temporary ref
|
|
153
187
|
is removed separately, and cleanup failure is reported without replacing a
|
|
154
188
|
primary failure.
|
|
@@ -167,6 +201,9 @@ or cleanup authority. Opening a reconstruction remains a separate operation.
|
|
|
167
201
|
External packages can expose a zero-argument factory through the
|
|
168
202
|
`gr2.platform_adapters` entry-point group. See [the adapter contract](docs/PR-LIFECYCLE.md#51-adapter-protocol-and-capabilities)
|
|
169
203
|
for registration, optional operation capabilities and merge head-pin requirements.
|
|
204
|
+
What changed in that protocol, release by release, ships in the package: read it from
|
|
205
|
+
an install with `importlib.resources.files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md"`,
|
|
206
|
+
or in this repository at [gr2/PLATFORM_ADAPTER_CHANGELOG.md](gr2/PLATFORM_ADAPTER_CHANGELOG.md).
|
|
170
207
|
Select the installed adapter with `gr2 pr create ... --platform NAME` on a
|
|
171
208
|
materialized lane. The bound-lane path currently pushes and returns its receipt.
|
|
172
209
|
|
|
@@ -209,13 +246,13 @@ failure at that commit. Concurrent writes union observations with bounded
|
|
|
209
246
|
compare-and-swap retries. An unmeasurable push acknowledgement is reported as
|
|
210
247
|
indeterminate unless a fresh remote read confirms the observation.
|
|
211
248
|
|
|
212
|
-
## Merge a
|
|
249
|
+
## Merge a pinned review into plain Git remotes
|
|
213
250
|
|
|
214
251
|
```sh
|
|
215
252
|
gr2 review merge
|
|
216
253
|
```
|
|
217
254
|
|
|
218
|
-
This merges the review
|
|
255
|
+
This merges the review pinned at the members' current heads, from their current branch, into the
|
|
219
256
|
branch on each remote that still sits at the reviewed base, and prints what it resolved. If several
|
|
220
257
|
branches sit there, it asks for `--into`. It merges only if every member's remote feature
|
|
221
258
|
branch is still the reviewed head, the target is still the reviewed base, and the exact-head check
|
|
@@ -227,7 +264,7 @@ Exit codes:
|
|
|
227
264
|
- 3: none merged (refused);
|
|
228
265
|
- 4: partial or unknown.
|
|
229
266
|
|
|
230
|
-
A review id, `--from` and `--into` override the defaults. Zero or several matching
|
|
267
|
+
A review id, `--from` and `--into` override the defaults. Zero or several matching pinned reviews, or members on
|
|
231
268
|
different branches, refuse and name the value to pass.
|
|
232
269
|
|
|
233
270
|
These records are attestations by writers trusted with remote access, not signed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gitgrip
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0a8
|
|
4
4
|
Summary: Workspace layer for multi-repo work: workspaces, isolated lanes, and one grouped review per slice
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -21,7 +21,7 @@ Requires-Dist: packaging>=22; extra == "dev"
|
|
|
21
21
|
## Install
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
uv tool install --pre gitgrip # the PyPI package is "gitgrip";
|
|
24
|
+
uv tool install --pre gitgrip # the PyPI package is "gitgrip"; it installs `gr` and `gr2`
|
|
25
25
|
gr2 --version
|
|
26
26
|
```
|
|
27
27
|
|
|
@@ -37,7 +37,9 @@ gr2 --version
|
|
|
37
37
|
|
|
38
38
|
Already installed 1.5.0 or 1.5.1? The install commands above leave it in place, because an installed version already satisfies them. Upgrade explicitly: `uv tool upgrade --prerelease allow gitgrip`, or `pip install --pre -U gitgrip`. To run unreleased development code instead, install from a checkout: `pip install -e gr2/` from the repository root.
|
|
39
39
|
|
|
40
|
-
The
|
|
40
|
+
The package installs two commands. `gr2` always runs gr2. `gr` picks by the nearest workspace marker: in a gr1 workspace (`.gitgrip`) it runs gr1, and anywhere else, including outside any workspace, it runs gr2.
|
|
41
|
+
|
|
42
|
+
The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`, as `gr` and `gitgrip`. You can have both installed. Whichever `gr` comes first on `PATH` answers: gitgrip 1.5 and earlier always run gr1, so if it comes first, type `gr2` for gr2 (`gr2` says so once). In a gr1 workspace, this package's `gr` runs gr1 through `gitgrip`. With no gr1 installed, it serves a workspace already moved with `gr2 workspace migrate-gr1`, and in one not yet moved it says how to move it.
|
|
41
43
|
|
|
42
44
|
## First five minutes
|
|
43
45
|
|
|
@@ -108,13 +110,45 @@ Not there yet:
|
|
|
108
110
|
| `sync` | status, run |
|
|
109
111
|
| `pr` | create, status, checks, merge, view |
|
|
110
112
|
| `check` | run, show |
|
|
111
|
-
| `review` | open, close, checkout-pr, run, check,
|
|
113
|
+
| `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
|
|
112
114
|
| `exec` | status, run |
|
|
113
115
|
| `repo` | status, projection-run |
|
|
114
116
|
| `hooks` | trust, revoke, status, show, run |
|
|
115
117
|
| `store` | init, commit, check, push, status, log, diff, checkout, materialize, migrate, migrate-reviews |
|
|
116
118
|
| `target`, `config` | stored PR target; config overlays |
|
|
117
119
|
|
|
120
|
+
`review bind`, `review approve` and `review rebind` remain as aliases of `pin`, `stamp` and `repin`.
|
|
121
|
+
|
|
122
|
+
The words these commands use (lane, pin, stamp, repin, gate, review) are defined in [docs/GLOSSARY.md](docs/GLOSSARY.md).
|
|
123
|
+
|
|
124
|
+
## Stamps (unsigned approvals)
|
|
125
|
+
|
|
126
|
+
Inside a workspace with one pinned review matching every member's current head,
|
|
127
|
+
a reviewer stamps it as the workspace's Git `user.name`:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
gr2 review stamp
|
|
131
|
+
gr2 review merge
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
The author recorded by the pin, and anyone who authored a commit in its range,
|
|
135
|
+
cannot stamp it. A stamp records an approval; approver names are self-declared and receipts say `signed: false`.
|
|
136
|
+
Repeated stamps by the same name count once. A moved head needs a new pin
|
|
137
|
+
and fresh stamps. Signing is not implemented by these commands.
|
|
138
|
+
|
|
139
|
+
The workspace's `grip.toml` sets the number required before merging:
|
|
140
|
+
|
|
141
|
+
```toml
|
|
142
|
+
[approvals]
|
|
143
|
+
required = 2
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
The default is zero; `review merge --approvals N` can raise the count for that
|
|
147
|
+
run, but cannot lower the workspace policy. With zero required, the merge gate
|
|
148
|
+
skips approval counting. When approvals are required, broken records or different
|
|
149
|
+
chain tips across member remotes refuse before this run pushes a merge. After a refused stamp, rerun
|
|
150
|
+
`review stamp` to read the current chain and retry with a lease.
|
|
151
|
+
|
|
118
152
|
## Overlay substrate
|
|
119
153
|
|
|
120
154
|
gr2 also carries the config-overlay substrate (capture, compose, and materialize configuration layers over a workspace): see [docs/OVERLAY-SUBSTRATE.md](docs/OVERLAY-SUBSTRATE.md).
|
|
@@ -133,17 +167,17 @@ Migration: use `gr2 review check` for compiled review requirements. `review requ
|
|
|
133
167
|
remains a hidden alias with a warning on stderr until beta. Both report `satisfied`
|
|
134
168
|
in the same JSON payload, and a missing reviewer remains a reported status with exit 0.
|
|
135
169
|
|
|
136
|
-
A bare `gr2 review open <workspace>` uses the workspace's sole review
|
|
170
|
+
A bare `gr2 review open <workspace>` uses the workspace's sole pinned review. Its default directory is `<workspace>.review/<sha8>` in the workspace's parent directory, and the command announces that path on stderr. Give `--lane-dir` to choose another location.
|
|
137
171
|
|
|
138
|
-
New
|
|
172
|
+
New pinned reviews record the author's Git `user.name` from the workspace root.
|
|
139
173
|
Set it with `git config user.name 'Your Name'` there if Git has no configured name.
|
|
140
|
-
`review show --json` and `review verify --json` include this author; older
|
|
174
|
+
`review show --json` and `review verify --json` include this author; older pinned reviews
|
|
141
175
|
remain readable without an author field, and reading them does not invent one.
|
|
142
176
|
|
|
143
177
|
|
|
144
178
|
## Transfer a native review
|
|
145
179
|
|
|
146
|
-
Publish an existing
|
|
180
|
+
Publish an existing pinned review and receive it in another native workspace:
|
|
147
181
|
|
|
148
182
|
```bash
|
|
149
183
|
gr2 review publish gr:<full-review-id> --remote https://example.org/workspace.git
|
|
@@ -164,7 +198,7 @@ refused without falling back to context.
|
|
|
164
198
|
Publish transfers only that review ref and confirms its returned target. Receive
|
|
165
199
|
compares both the advertised and actual fetched raw target with the expected ID,
|
|
166
200
|
requires a commit and recomputable review content, then creates the canonical
|
|
167
|
-
local
|
|
201
|
+
local review ref. A valid same-ID receive is idempotent. A conflicting existing ref
|
|
168
202
|
is refused. Object downloads may remain after refusal. The owned temporary ref
|
|
169
203
|
is removed separately, and cleanup failure is reported without replacing a
|
|
170
204
|
primary failure.
|
|
@@ -183,6 +217,9 @@ or cleanup authority. Opening a reconstruction remains a separate operation.
|
|
|
183
217
|
External packages can expose a zero-argument factory through the
|
|
184
218
|
`gr2.platform_adapters` entry-point group. See [the adapter contract](docs/PR-LIFECYCLE.md#51-adapter-protocol-and-capabilities)
|
|
185
219
|
for registration, optional operation capabilities and merge head-pin requirements.
|
|
220
|
+
What changed in that protocol, release by release, ships in the package: read it from
|
|
221
|
+
an install with `importlib.resources.files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md"`,
|
|
222
|
+
or in this repository at [gr2/PLATFORM_ADAPTER_CHANGELOG.md](gr2/PLATFORM_ADAPTER_CHANGELOG.md).
|
|
186
223
|
Select the installed adapter with `gr2 pr create ... --platform NAME` on a
|
|
187
224
|
materialized lane. The bound-lane path currently pushes and returns its receipt.
|
|
188
225
|
|
|
@@ -225,13 +262,13 @@ failure at that commit. Concurrent writes union observations with bounded
|
|
|
225
262
|
compare-and-swap retries. An unmeasurable push acknowledgement is reported as
|
|
226
263
|
indeterminate unless a fresh remote read confirms the observation.
|
|
227
264
|
|
|
228
|
-
## Merge a
|
|
265
|
+
## Merge a pinned review into plain Git remotes
|
|
229
266
|
|
|
230
267
|
```sh
|
|
231
268
|
gr2 review merge
|
|
232
269
|
```
|
|
233
270
|
|
|
234
|
-
This merges the review
|
|
271
|
+
This merges the review pinned at the members' current heads, from their current branch, into the
|
|
235
272
|
branch on each remote that still sits at the reviewed base, and prints what it resolved. If several
|
|
236
273
|
branches sit there, it asks for `--into`. It merges only if every member's remote feature
|
|
237
274
|
branch is still the reviewed head, the target is still the reviewed base, and the exact-head check
|
|
@@ -243,7 +280,7 @@ Exit codes:
|
|
|
243
280
|
- 3: none merged (refused);
|
|
244
281
|
- 4: partial or unknown.
|
|
245
282
|
|
|
246
|
-
A review id, `--from` and `--into` override the defaults. Zero or several matching
|
|
283
|
+
A review id, `--from` and `--into` override the defaults. Zero or several matching pinned reviews, or members on
|
|
247
284
|
different branches, refuse and name the value to pass.
|
|
248
285
|
|
|
249
286
|
These records are attestations by writers trusted with remote access, not signed
|
|
@@ -6,6 +6,7 @@ gitgrip.egg-info/dependency_links.txt
|
|
|
6
6
|
gitgrip.egg-info/entry_points.txt
|
|
7
7
|
gitgrip.egg-info/requires.txt
|
|
8
8
|
gitgrip.egg-info/top_level.txt
|
|
9
|
+
gr2/PLATFORM_ADAPTER_CHANGELOG.md
|
|
9
10
|
gr2/__init__.py
|
|
10
11
|
gr2/api_core.py
|
|
11
12
|
gr2/overlay/__init__.py
|
|
@@ -50,6 +51,7 @@ gr2/python_cli/__main__.py
|
|
|
50
51
|
gr2/python_cli/add.py
|
|
51
52
|
gr2/python_cli/app.py
|
|
52
53
|
gr2/python_cli/approval_schema.py
|
|
54
|
+
gr2/python_cli/approvals.py
|
|
53
55
|
gr2/python_cli/branch.py
|
|
54
56
|
gr2/python_cli/channel_bridge.py
|
|
55
57
|
gr2/python_cli/check_records.py
|
|
@@ -70,6 +72,7 @@ gr2/python_cli/git_review.py
|
|
|
70
72
|
gr2/python_cli/gitinclude.py
|
|
71
73
|
gr2/python_cli/gitops.py
|
|
72
74
|
gr2/python_cli/gr_resolver.py
|
|
75
|
+
gr2/python_cli/gr_shadow.py
|
|
73
76
|
gr2/python_cli/grip.py
|
|
74
77
|
gr2/python_cli/grip_cli.py
|
|
75
78
|
gr2/python_cli/hooks.py
|
|
@@ -156,10 +159,14 @@ tests/test_first_five_minutes.py
|
|
|
156
159
|
tests/test_foreground_launch_runtime.py
|
|
157
160
|
tests/test_git_review.py
|
|
158
161
|
tests/test_gitinclude_compiler.py
|
|
162
|
+
tests/test_gitops_shared.py
|
|
159
163
|
tests/test_gr1_first_run_guidance.py
|
|
160
164
|
tests/test_gr2_packaging.py
|
|
161
165
|
tests/test_gr2_review_receipt.py
|
|
166
|
+
tests/test_gr_installed_wheel.py
|
|
167
|
+
tests/test_gr_resolved_cleared.py
|
|
162
168
|
tests/test_gr_resolver_conformance.py
|
|
169
|
+
tests/test_gr_shadow.py
|
|
163
170
|
tests/test_grip_cli.py
|
|
164
171
|
tests/test_grip_hardening.py
|
|
165
172
|
tests/test_grip_snapshot.py
|
|
@@ -183,6 +190,7 @@ tests/test_lane_lease_show_json.py
|
|
|
183
190
|
tests/test_lane_lifecycle_safety.py
|
|
184
191
|
tests/test_lane_plugins.py
|
|
185
192
|
tests/test_lane_probe.py
|
|
193
|
+
tests/test_lane_probe_batch.py
|
|
186
194
|
tests/test_lane_repo_paths_and_all_skipped.py
|
|
187
195
|
tests/test_lane_roles.py
|
|
188
196
|
tests/test_lane_show_name.py
|
|
@@ -229,6 +237,7 @@ tests/test_overlay_tier_b_repo_state.py
|
|
|
229
237
|
tests/test_overlay_tier_b_staging_discipline.py
|
|
230
238
|
tests/test_overlay_trust_model.py
|
|
231
239
|
tests/test_overlay_workspace_spec.py
|
|
240
|
+
tests/test_platform_adapter_changelog.py
|
|
232
241
|
tests/test_platform_adapter_plugins.py
|
|
233
242
|
tests/test_pr_events.py
|
|
234
243
|
tests/test_pr_group_legibility.py
|
|
@@ -260,6 +269,7 @@ tests/test_review_a4_v2.py
|
|
|
260
269
|
tests/test_review_a4_v3.py
|
|
261
270
|
tests/test_review_allocation_recovery.py
|
|
262
271
|
tests/test_review_ansi_parse.py
|
|
272
|
+
tests/test_review_approvals.py
|
|
263
273
|
tests/test_review_b3_reader_alignment.py
|
|
264
274
|
tests/test_review_bind_author.py
|
|
265
275
|
tests/test_review_bind_fork_base.py
|
|
@@ -285,6 +295,7 @@ tests/test_review_install_hint.py
|
|
|
285
295
|
tests/test_review_merge_gate.py
|
|
286
296
|
tests/test_review_merge_gate_lost_ack.py
|
|
287
297
|
tests/test_review_open_lane.py
|
|
298
|
+
tests/test_review_pin_stamp_names.py
|
|
288
299
|
tests/test_review_pr_marker_context.py
|
|
289
300
|
tests/test_review_reader_defaults.py
|
|
290
301
|
tests/test_review_rebind.py
|
|
@@ -306,6 +317,7 @@ tests/test_review_subject.py
|
|
|
306
317
|
tests/test_review_transport.py
|
|
307
318
|
tests/test_review_v1_format_guard.py
|
|
308
319
|
tests/test_review_verify_inside.py
|
|
320
|
+
tests/test_review_vocabulary.py
|
|
309
321
|
tests/test_rmtree_or_refuse.py
|
|
310
322
|
tests/test_root_option_verbs.py
|
|
311
323
|
tests/test_selected_workspace_commit.py
|
|
@@ -348,6 +360,7 @@ tests/test_unit_topological_apply.py
|
|
|
348
360
|
tests/test_validate_repo_path_conflict.py
|
|
349
361
|
tests/test_version_identity.py
|
|
350
362
|
tests/test_version_static.py
|
|
363
|
+
tests/test_vocabulary.py
|
|
351
364
|
tests/test_workspace_convert_clone.py
|
|
352
365
|
tests/test_workspace_edit_lease_cap.py
|
|
353
366
|
tests/test_workspace_identity_boundary.py
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# gr2 platform adapter protocol: changes
|
|
2
|
+
|
|
3
|
+
This file ships inside the `gitgrip` wheel and sdist, so an adapter author can read it from the installed
|
|
4
|
+
package:
|
|
5
|
+
|
|
6
|
+
```python
|
|
7
|
+
from importlib.resources import files
|
|
8
|
+
print((files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md").read_text())
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
It covers what an out-of-tree adapter implements or receives: the `PlatformAdapter` protocol in
|
|
12
|
+
`gr2.python_cli.platform`, the request and result types passed through it, and the registration seam.
|
|
13
|
+
Each entry names the release that first carried it. The full release notes for every change are in the
|
|
14
|
+
project's `CHANGELOG.md` and its GitHub releases.
|
|
15
|
+
|
|
16
|
+
`PLATFORM_ADAPTER_API_VERSION` is the protocol's version number. It is `1`, and it changes only for a change
|
|
17
|
+
an existing adapter cannot absorb.
|
|
18
|
+
|
|
19
|
+
## 2.0.0a8
|
|
20
|
+
|
|
21
|
+
- **`CreatePRRequest.remote`** is new (default `None`): the exact Git URL configured for the selected
|
|
22
|
+
member in the workspace spec or review bind. Created PR groups retain it as `prs[].remote` when it is
|
|
23
|
+
supplied. Direct Python callers may omit it and keep the previous stored-group shape. This is additive
|
|
24
|
+
to adapter API version 1; factories still take no arguments and `repo` keeps its existing value.
|
|
25
|
+
Later lifecycle calls still receive the existing repo string; this field supplies creation context only.
|
|
26
|
+
Lane URLs are stripped of surrounding whitespace; blank values are treated as absent.
|
|
27
|
+
A lane member URL carrying credentials is refused by member name before adapter calls or PR state writes.
|
|
28
|
+
|
|
29
|
+
## 2.0.0a7
|
|
30
|
+
|
|
31
|
+
- **Registration.** Adapters register through the `gr2.platform_adapters` entry point group
|
|
32
|
+
(`PLATFORM_ADAPTER_ENTRY_POINTS`), or in-process with `register_platform_adapter(name, factory)`, where
|
|
33
|
+
`factory` takes no arguments and returns the adapter. A factory is loaded only when its platform is
|
|
34
|
+
selected. Names are lowercase (`[a-z][a-z0-9_-]*`); `github` and `gh` are reserved, and a name registered
|
|
35
|
+
twice is refused.
|
|
36
|
+
- **`PLATFORM_ADAPTER_API_VERSION = 1`.** An adapter may set `platform_adapter_api_version`; when the adapter
|
|
37
|
+
is loaded, gr2 refuses one that declares any other value.
|
|
38
|
+
- **`require_adapter_capability(adapter, method)`.** A verb that needs a method the adapter does not
|
|
39
|
+
provide now fails with a named refusal before any member is changed, instead of a `TypeError` or
|
|
40
|
+
`AttributeError` mid-run. Every adapter must provide `create_pr` when it is loaded. **`merge_pr` must
|
|
41
|
+
accept the `method` and `expected_head` keywords**; an adapter whose `merge_pr` does not is refused rather
|
|
42
|
+
than called without the head pin.
|
|
43
|
+
- **`CreatePRRequest.draft` defaults to `True`** (it was `False`). A pull request opens as a draft unless
|
|
44
|
+
the caller asks otherwise, so an adapter must honour `draft` rather than assume a ready PR.
|
|
45
|
+
|
|
46
|
+
## 2.0.0a6
|
|
47
|
+
|
|
48
|
+
- **`pr_view(repo, number) -> PRDetail`** is new: one PR's full state. `PRDetail` carries `ref`, `state`,
|
|
49
|
+
`body`, `author`, `labels`, `review_decision`, `reviews`, `head_oid`, `is_draft`, `merged`, `mergeable` and
|
|
50
|
+
`checks`.
|
|
51
|
+
- **New type `PRReview`**, one review on a PR: `user` and `state`.
|
|
52
|
+
- **`merge_pr(..., *, method, expected_head=None)`** gains `expected_head`. When it is given, the adapter
|
|
53
|
+
must merge only if the PR's head is still that commit, and refuse otherwise; `gr2 pr merge
|
|
54
|
+
--match-head-commit` relies on it.
|
|
55
|
+
- **`PRStatus.head_oid`** is new (default `None`): the PR's current head commit, which gr2 compares against
|
|
56
|
+
the reviewed head.
|
|
57
|
+
|
|
58
|
+
## 2.0.0a5
|
|
59
|
+
|
|
60
|
+
- **`edit_pr_body(repo, number, body) -> None`** is new: replaces a PR's description. gr2 uses it to keep a
|
|
61
|
+
grouped PR set's cross-links current.
|
|
62
|
+
|
|
63
|
+
## 2.0.0a1 to 2.0.0a4
|
|
64
|
+
|
|
65
|
+
The protocol as first published: `name`, `create_pr(CreatePRRequest) -> PRRef`, `merge_pr(repo, number, *,
|
|
66
|
+
method) -> MergeReceipt`, `pr_status(repo, number) -> PRStatus`, `list_prs(repo, *, head_branch=None)`, and
|
|
67
|
+
`pr_checks(repo, number) -> list[PRCheck]`. No protocol change between these four releases.
|
|
@@ -15,6 +15,7 @@ from gr2.overlay.trust import (
|
|
|
15
15
|
trust_config_path,
|
|
16
16
|
)
|
|
17
17
|
from gr2.overlay.types import OverlayRef
|
|
18
|
+
from gr2.python_cli import gitops
|
|
18
19
|
|
|
19
20
|
GRIP_DIR = ".grip"
|
|
20
21
|
STACK_FILE = "overlay-stack.json"
|
|
@@ -187,10 +188,5 @@ def _load_managed_files(workspace_root: Path) -> dict[str, list[str]]:
|
|
|
187
188
|
|
|
188
189
|
|
|
189
190
|
def _git_output(git_dir: Path, *args: str) -> str:
|
|
190
|
-
result =
|
|
191
|
-
["git", f"--git-dir={git_dir}", *args],
|
|
192
|
-
check=True,
|
|
193
|
-
capture_output=True,
|
|
194
|
-
text=True,
|
|
195
|
-
)
|
|
191
|
+
result = gitops.check(gitops.run_argv(["git", f"--git-dir={git_dir}", *args]))
|
|
196
192
|
return result.stdout.strip()
|
|
@@ -8,6 +8,7 @@ from pathlib import Path
|
|
|
8
8
|
from typing import Any
|
|
9
9
|
|
|
10
10
|
from gr2.overlay.types import OverlayRef
|
|
11
|
+
from gr2.python_cli import gitops
|
|
11
12
|
|
|
12
13
|
GRIP_DIR = ".grip"
|
|
13
14
|
|
|
@@ -146,10 +147,5 @@ def _read_overlay_file_list(overlay_store: Path, overlay_ref: OverlayRef) -> lis
|
|
|
146
147
|
|
|
147
148
|
|
|
148
149
|
def _git_output(git_dir: Path, *args: str) -> str:
|
|
149
|
-
result =
|
|
150
|
-
["git", f"--git-dir={git_dir}", *args],
|
|
151
|
-
check=True,
|
|
152
|
-
capture_output=True,
|
|
153
|
-
text=True,
|
|
154
|
-
)
|
|
150
|
+
result = gitops.check(gitops.run_argv(["git", f"--git-dir={git_dir}", *args]))
|
|
155
151
|
return result.stdout.strip()
|