gitgrip 2.0.0a7__tar.gz → 2.0.0a9__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.0a9}/PKG-INFO +62 -16
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/README.md +61 -15
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gitgrip.egg-info/PKG-INFO +62 -16
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gitgrip.egg-info/SOURCES.txt +72 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gitgrip.egg-info/entry_points.txt +1 -0
- gitgrip-2.0.0a9/gr2/PLATFORM_ADAPTER_CHANGELOG.md +97 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/activate.py +2 -6
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/introspection.py +2 -6
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/objects.py +14 -77
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/refs.py +3 -12
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/repo_maintenance_prototype.py +55 -1
- gitgrip-2.0.0a9/gr2/python_cli/agent_record.py +269 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/app.py +596 -75
- gitgrip-2.0.0a9/gr2/python_cli/approvals.py +319 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/check_records.py +7 -10
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/clone_exec.py +2 -2
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/consent.py +63 -30
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/context.py +2 -1
- gitgrip-2.0.0a9/gr2/python_cli/declared_sets.py +217 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/defaults.py +5 -5
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/execops.py +20 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/git_review.py +4 -6
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/gitops.py +155 -66
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/gr_resolver.py +67 -14
- gitgrip-2.0.0a9/gr2/python_cli/gr_shadow.py +101 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/grip.py +115 -68
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/grip_cli.py +1273 -60
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/hooks.py +292 -6
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/lane_defaults.py +2 -4
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/lane_downstream.py +15 -2
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/launch_exec.py +58 -6
- gitgrip-2.0.0a9/gr2/python_cli/member_field_tree.py +202 -0
- gitgrip-2.0.0a9/gr2/python_cli/merge_gate.py +460 -0
- gitgrip-2.0.0a9/gr2/python_cli/merge_receipts.py +67 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/merge_verification.py +2 -7
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/migration.py +240 -11
- gitgrip-2.0.0a9/gr2/python_cli/names.py +78 -0
- gitgrip-2.0.0a9/gr2/python_cli/next_steps.py +101 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/open_gr_review.py +58 -4
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/platform.py +72 -6
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/pr.py +67 -5
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/prune.py +2 -8
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/push.py +113 -2
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_ephemeral.py +5 -10
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_field_tree.py +137 -32
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_members.py +14 -6
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_rebind.py +10 -9
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_records.py +2 -4
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_run.py +62 -12
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/root_option.py +35 -0
- gitgrip-2.0.0a9/gr2/python_cli/set_check.py +319 -0
- gitgrip-2.0.0a9/gr2/python_cli/set_hints.py +132 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/spec_apply.py +19 -1
- gitgrip-2.0.0a9/gr2/python_cli/store_hooks.py +579 -0
- gitgrip-2.0.0a9/gr2/python_cli/workspace_mode.py +50 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/pyproject.toml +5 -2
- gitgrip-2.0.0a9/tests/test_agent_record_append.py +360 -0
- gitgrip-2.0.0a9/tests/test_agent_record_fold.py +334 -0
- gitgrip-2.0.0a9/tests/test_agent_record_stamps.py +210 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_api_dump.py +8 -1
- gitgrip-2.0.0a9/tests/test_consent_key_paths.py +215 -0
- gitgrip-2.0.0a9/tests/test_declared_set_pins.py +144 -0
- gitgrip-2.0.0a9/tests/test_declared_sets.py +416 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_defaults_from_repo.py +4 -4
- gitgrip-2.0.0a9/tests/test_exec_run_names_what_did_not_run.py +95 -0
- gitgrip-2.0.0a9/tests/test_field_tree_schema_reader.py +140 -0
- gitgrip-2.0.0a9/tests/test_files_compose.py +382 -0
- gitgrip-2.0.0a9/tests/test_git_transport_allow_list.py +254 -0
- gitgrip-2.0.0a9/tests/test_gitops_shared.py +340 -0
- gitgrip-2.0.0a9/tests/test_gr_installed_wheel.py +70 -0
- gitgrip-2.0.0a9/tests/test_gr_resolved_cleared.py +14 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_gr_resolver_conformance.py +67 -9
- gitgrip-2.0.0a9/tests/test_gr_shadow.py +176 -0
- gitgrip-2.0.0a9/tests/test_grip_toml_literals.py +95 -0
- gitgrip-2.0.0a9/tests/test_hostile_names.py +218 -0
- gitgrip-2.0.0a9/tests/test_hostile_names_helper.py +83 -0
- gitgrip-2.0.0a9/tests/test_lane_probe_batch.py +134 -0
- gitgrip-2.0.0a9/tests/test_lane_push.py +291 -0
- gitgrip-2.0.0a9/tests/test_lane_remove.py +329 -0
- gitgrip-2.0.0a9/tests/test_malformed_remote_refusal.py +46 -0
- gitgrip-2.0.0a9/tests/test_migration_desk_state.py +512 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_migration_unadopted_notice.py +13 -3
- gitgrip-2.0.0a9/tests/test_names.py +50 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_native_store_gitinclude.py +1 -1
- gitgrip-2.0.0a9/tests/test_np_bench_contract_scenario.py +131 -0
- gitgrip-2.0.0a9/tests/test_out_of_set_hint.py +181 -0
- gitgrip-2.0.0a9/tests/test_platform_adapter_changelog.py +115 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_platform_adapter_plugins.py +141 -54
- gitgrip-2.0.0a9/tests/test_pr_adapter_v2_target.py +377 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_review_subject.py +51 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_push.py +1 -1
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_readme_verbs_exist.py +13 -0
- gitgrip-2.0.0a9/tests/test_retire_gr1.py +137 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_a4.py +7 -7
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_a4_v2.py +61 -4
- gitgrip-2.0.0a9/tests/test_review_approvals.py +837 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_author.py +16 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_migration.py +1 -1
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_native_store.py +1 -1
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_close_keeps_local_work.py +221 -1
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_field_tree_reader_edges.py +1 -1
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_merge_gate.py +118 -4
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_merge_gate_lost_ack.py +9 -8
- gitgrip-2.0.0a9/tests/test_review_merge_receipt.py +133 -0
- gitgrip-2.0.0a9/tests/test_review_merge_updates_tracking_ref.py +154 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_open_lane.py +59 -0
- gitgrip-2.0.0a9/tests/test_review_pin_stamp_names.py +57 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_reader_defaults.py +5 -5
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_remote_safety.py +122 -0
- gitgrip-2.0.0a9/tests/test_review_run_deleted_cwd.py +73 -0
- gitgrip-2.0.0a9/tests/test_review_run_package_name.py +40 -0
- gitgrip-2.0.0a9/tests/test_review_run_venv_and_refusal_identity.py +133 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_subject.py +5 -5
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_transport.py +1 -1
- gitgrip-2.0.0a9/tests/test_review_vocabulary.py +66 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_root_option_verbs.py +12 -6
- gitgrip-2.0.0a9/tests/test_set_check.py +305 -0
- gitgrip-2.0.0a9/tests/test_set_check_remote_heads.py +162 -0
- gitgrip-2.0.0a9/tests/test_skill_dump.py +111 -0
- gitgrip-2.0.0a9/tests/test_spec_show_native_root.py +140 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_break_attempts.py +8 -3
- gitgrip-2.0.0a9/tests/test_store_commit_follows_branch.py +158 -0
- gitgrip-2.0.0a9/tests/test_store_commit_keeps_record.py +152 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_commit_noop.py +4 -4
- gitgrip-2.0.0a9/tests/test_store_commit_refuses_rewind.py +499 -0
- gitgrip-2.0.0a9/tests/test_store_full_mode_carrier.py +364 -0
- gitgrip-2.0.0a9/tests/test_store_full_mode_coverage.py +386 -0
- gitgrip-2.0.0a9/tests/test_store_full_mode_layers.py +453 -0
- gitgrip-2.0.0a9/tests/test_store_full_mode_records.py +244 -0
- gitgrip-2.0.0a9/tests/test_store_git_hooks.py +641 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_git_native_smoke.py +1 -0
- gitgrip-2.0.0a9/tests/test_store_gitmodules.py +188 -0
- gitgrip-2.0.0a9/tests/test_store_gitmodules_branch.py +150 -0
- gitgrip-2.0.0a9/tests/test_store_hook_takes_verb_coverage.py +190 -0
- gitgrip-2.0.0a9/tests/test_store_init_clone.py +220 -0
- gitgrip-2.0.0a9/tests/test_store_materialize_branch.py +174 -0
- gitgrip-2.0.0a9/tests/test_store_materialize_fetches_new_pin.py +214 -0
- gitgrip-2.0.0a9/tests/test_store_materialize_installs_hooks.py +179 -0
- gitgrip-2.0.0a9/tests/test_store_status_inspection.py +129 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_status_values.py +49 -0
- gitgrip-2.0.0a9/tests/test_store_submodule_init.py +146 -0
- gitgrip-2.0.0a9/tests/test_store_submodule_update_merge.py +172 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_verb_witnesses.py +212 -7
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sync_ssh_rewrite.py +6 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sync_status_probe.py +3 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_tmux_launch_runtime.py +102 -5
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_version_static.py +2 -2
- gitgrip-2.0.0a9/tests/test_vocabulary.py +115 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_convert_clone.py +196 -0
- gitgrip-2.0.0a7/gr2/python_cli/merge_gate.py +0 -277
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gitgrip.egg-info/dependency_links.txt +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gitgrip.egg-info/requires.txt +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gitgrip.egg-info/top_level.txt +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/__init__.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/api_core.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/__init__.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/agent_manifest.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/cross_repo.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/drivers.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/language_drivers.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/perf.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/trust.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/types.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/units.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/workspace_spec.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/__init__.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/cache_materialization_probe.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/concurrent_event_stress.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/concurrent_lease_stress.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/concurrent_workspace_cap_stress.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/contribution_protocol.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/cross_mode_lane_stress.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/jsonl_store.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/lane_workspace_prototype.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/layout_model_probe.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/propagation_daemon.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/propagation_state_machine.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/python_exec_playground.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/python_hook_runtime_playground.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/python_migration_playground.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/python_review_checkout_playground.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/python_spec_apply_playground.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/real_git_lane_materialization.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/real_git_playground.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/recall_lane_history.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/repo_transport_probe.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/__init__.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/__main__.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/add.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/approval_schema.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/branch.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/channel_bridge.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/commit.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/config.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/ecosystems_python.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/env_exec.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/events.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/exit_codes.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/failures.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/file_exec.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/gitinclude.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/lane_graph.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/lane_plugins.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/layout.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/project_review.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_allocation.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_dispatch.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_runners.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/staging_cleanup.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/syncops.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/target.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/version.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/workspace_guidance.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/workspace_snapshot.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.approval.v1alpha1/approval.proto +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.approval.v1alpha1/descriptor_set.pb +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.check.v1alpha1/check.proto +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.check.v1alpha1/descriptor_set.pb +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.merge.v1alpha1/descriptor_set.pb +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.merge.v1alpha1/merge.proto +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.review.v1alpha1/descriptor_set.pb +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.review.v1alpha1/review.proto +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/gr2-materialization-plan-v1.schema.json +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/gr2-workspace-spec-v1.schema.json +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2_overlay/__init__.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/setup.cfg +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_add.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_agent_manifest_overlay_source.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_api_core_seam.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_app_event_outcomes.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_apply_convergence.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_apply_gr1_sibling_adoption.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_approval_schema.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_branch.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_break_17_unit_path_containment.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_break_18_gr1_sibling_units.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_channel_bridge.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_cli_adapter_error_boundary.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_cli_shape_witnesses.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_clone_materialization.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_commit.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_config_base_path_guard.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_config_overlay.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_conftest_git_isolation.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_context_resolver.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_contribution_protocol.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_deprecation_registry.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_ecosystems_python.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_ensure_lane_checkout_reference_clone.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_env_materialization.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_event_log_integrity.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_event_outcome_policy.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_events.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_events_torn_line.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_exec_apostrophe_and_oserror.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_exec_single_string_and_materialize_plan.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_execops.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_failure_event_outcome.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_field_tree_name.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_first_five_minutes.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_foreground_launch_runtime.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_git_review.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_gitinclude_compiler.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_gr1_first_run_guidance.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_gr2_packaging.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_gr2_review_receipt.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_grip_cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_grip_hardening.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_grip_snapshot.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_grip_toml_schema_v1.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_hook_events.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_hook_hardening.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_hooks_consent.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_hooks_group_names.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_jsonl_store.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_checkout_root.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_create_defaults.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_create_fork_base_cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_create_refusal_leaves_nothing.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_create_refuses_own_branch.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_downstream.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_downstream_run.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_enter_hook_warnings.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_exit_keeps_dirty_work.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_graph.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_lease_show_json.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_lifecycle_safety.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_plugins.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_probe.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_repo_paths_and_all_skipped.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_roles.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_show_name.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_store_path_pins.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_toml_serialization.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_launch_primitive.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_layout_census.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_linked_review_receipts.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_m2_overlay_hindsight.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_m2_overlay_mem0.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_m2_overlay_zep.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_materialization_plan_contract.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_materialize_pin.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_member_working_root_checkout_materialize.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_merge_evidence.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_merge_parent_verification.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_migration.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_migration_overlay_compatibility.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_native_store_review_record_probes.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_no_bare_python_cli_imports.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_null_current_lane_refusal.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_open_gr_enter.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_open_project_refusal_reason_cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_outbox_ack_after_effect.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_acceptance.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_activate.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_cli_wiring.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_composition_merge.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_cross_repo_atomic_apply.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_cross_repo_perf_gate.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_cross_repo_rollback.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_driver_registry.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_introspection.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_multi_stack.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_object_encoding.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_perf_gates.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_python_driver.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_encoding.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_perf_gates.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_repo_state.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_staging_discipline.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_trust_model.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_workspace_spec.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_events.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_group_legibility.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_merge_head_pin.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_merge_method.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_merge_missing_target.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_merge_partial_failure.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_view.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_project_file_materialization.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_project_review_range_reconstruction.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_project_review_three_repo.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_projection_tracked_dest.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_propagation_contribution.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_propagation_daemon.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_propagation_state_machine.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_prune.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_python_group_install.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_record_schema_copies.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_remote_check_records.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_repo_path_read_through.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_repo_status_linked_worktree.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_repo_status_schema_version.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_repo_status_symlinked_git_dir.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_a4_v3.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_allocation_recovery.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_ansi_parse.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_b3_reader_alignment.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_fork_base.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_from_range.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_root_refs.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_verify.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_check_name.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_close_gr.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_context_defaults.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_context_witnesses.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_create_project_cli.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_dispatch.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_ephemeral.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_events.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_field_tree.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_field_tree_readers.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_install_hint.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_pr_marker_context.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_rebind.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_receipt_cleanup.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_ref_v1_migration.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_ref_v1_reader.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_ref_v1_writer.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_context.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_dependency_order.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_import_isolation.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_integrity_recheck.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_multi_repo.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_plugin_order.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_rerun_and_refusal_receipt.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_runners.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_v1_format_guard.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_verify_inside.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_rmtree_or_refuse.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_selected_workspace_commit.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_single_repo_cwd_refusal.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_snapshot_id_prefix_resolution.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_spec_apply_event_outcomes.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_spec_declaration_ref_pin.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sprint21_sync_platform.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_staging_cleanup.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_checkout_atomicity.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_declared_members.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_init_branch_inference.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_log_adoption_boundary.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_member_path_hygiene.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_member_state.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_migrate_branch_inference.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_moved_workspace_guard.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_verb_rename.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_submodule_member_predicate.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_superproject_import.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sync_event_outcomes.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sync_fast_forward.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sync_fetch.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sync_seed_local.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_target.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_unit_abort.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_unit_apply.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_unit_apply_dry_run.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_unit_manifest_schema.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_unit_propose.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_unit_topological_apply.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_validate_repo_path_conflict.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_version_identity.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_edit_lease_cap.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_identity_boundary.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_init_from_topology.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_init_local_repos.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_root_defaults.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_root_nearest_marker.py +0 -0
- {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/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.0a9
|
|
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
|
|
|
@@ -77,11 +79,14 @@ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
|
|
|
77
79
|
```bash
|
|
78
80
|
gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
|
|
79
81
|
gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
|
|
82
|
+
gr2 lane push ~/ws default feat-x # push every lane repo, each verified on its remote
|
|
80
83
|
gr2 lane show ~/ws default # where am I?
|
|
81
84
|
gr2 lane exit ~/ws default --actor human:you
|
|
85
|
+
gr2 lane list ~/ws # each lane: removable, or keep and why
|
|
86
|
+
gr2 lane remove ~/ws default feat-x # end it: its clones and record go
|
|
82
87
|
```
|
|
83
88
|
|
|
84
|
-
`exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
|
|
89
|
+
`lane remove` refuses while the lane is entered or leased, or was made by `lane bind`, while any of its repos holds uncommitted work, a stash, or a commit no remote has (on any branch or tag), or while its checkout holds anything that is not one of its repos; it names each one and removes nothing. `exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
|
|
85
90
|
|
|
86
91
|
## What works today, and what is not there yet
|
|
87
92
|
|
|
@@ -101,20 +106,52 @@ Not there yet:
|
|
|
101
106
|
|
|
102
107
|
| Group | Verbs |
|
|
103
108
|
|---|---|
|
|
104
|
-
| `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1, gitinclude |
|
|
109
|
+
| `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, retire-gr1, migrate-lane-state, bootstrap-gr1, gitinclude |
|
|
105
110
|
| `spec` | show, validate |
|
|
106
|
-
| `lane` | create, enter, exit, show, resolve, bind, lease |
|
|
111
|
+
| `lane` | create, enter, exit, show, resolve, bind, lease, list, push, remove |
|
|
107
112
|
| (top level) | branch, add, commit, push, prune, status, plan, apply |
|
|
108
113
|
| `sync` | status, run |
|
|
109
114
|
| `pr` | create, status, checks, merge, view |
|
|
110
|
-
| `check` | run, show |
|
|
111
|
-
| `review` | open, close, checkout-pr, run, check,
|
|
115
|
+
| `check` | run, show, set |
|
|
116
|
+
| `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
|
|
112
117
|
| `exec` | status, run |
|
|
113
118
|
| `repo` | status, projection-run |
|
|
114
119
|
| `hooks` | trust, revoke, status, show, run |
|
|
115
120
|
| `store` | init, commit, check, push, status, log, diff, checkout, materialize, migrate, migrate-reviews |
|
|
116
121
|
| `target`, `config` | stored PR target; config overlays |
|
|
117
122
|
|
|
123
|
+
`review bind`, `review approve` and `review rebind` remain as aliases of `pin`, `stamp` and `repin`.
|
|
124
|
+
|
|
125
|
+
The words these commands use (lane, pin, stamp, repin, gate, review) are defined in [docs/GLOSSARY.md](docs/GLOSSARY.md).
|
|
126
|
+
|
|
127
|
+
## Stamps (unsigned approvals)
|
|
128
|
+
|
|
129
|
+
Inside a workspace with one pinned review matching every member's current head,
|
|
130
|
+
a reviewer stamps it as the workspace's Git `user.name`:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
gr2 review stamp
|
|
134
|
+
gr2 review merge
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
The author recorded by the pin, and anyone who authored a commit in its range,
|
|
138
|
+
cannot stamp it. A stamp records an approval; approver names are self-declared and receipts say `signed: false`.
|
|
139
|
+
Repeated stamps by the same name count once. A moved head needs a new pin
|
|
140
|
+
and fresh stamps. Signing is not implemented by these commands.
|
|
141
|
+
|
|
142
|
+
The workspace's `grip.toml` sets the number required before merging:
|
|
143
|
+
|
|
144
|
+
```toml
|
|
145
|
+
[approvals]
|
|
146
|
+
required = 2
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The default is zero; `review merge --approvals N` can raise the count for that
|
|
150
|
+
run, but cannot lower the workspace policy. With zero required, the merge gate
|
|
151
|
+
skips approval counting. When approvals are required, broken records or different
|
|
152
|
+
chain tips across member remotes refuse before this run pushes a merge. After a refused stamp, rerun
|
|
153
|
+
`review stamp` to read the current chain and retry with a lease.
|
|
154
|
+
|
|
118
155
|
## Overlay substrate
|
|
119
156
|
|
|
120
157
|
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 +170,17 @@ Migration: use `gr2 review check` for compiled review requirements. `review requ
|
|
|
133
170
|
remains a hidden alias with a warning on stderr until beta. Both report `satisfied`
|
|
134
171
|
in the same JSON payload, and a missing reviewer remains a reported status with exit 0.
|
|
135
172
|
|
|
136
|
-
A bare `gr2 review open <workspace>` uses the workspace's sole review
|
|
173
|
+
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
174
|
|
|
138
|
-
New
|
|
175
|
+
New pinned reviews record the author's Git `user.name` from the workspace root.
|
|
139
176
|
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
|
|
177
|
+
`review show --json` and `review verify --json` include this author; older pinned reviews
|
|
141
178
|
remain readable without an author field, and reading them does not invent one.
|
|
142
179
|
|
|
143
180
|
|
|
144
181
|
## Transfer a native review
|
|
145
182
|
|
|
146
|
-
Publish an existing
|
|
183
|
+
Publish an existing pinned review and receive it in another native workspace:
|
|
147
184
|
|
|
148
185
|
```bash
|
|
149
186
|
gr2 review publish gr:<full-review-id> --remote https://example.org/workspace.git
|
|
@@ -164,7 +201,7 @@ refused without falling back to context.
|
|
|
164
201
|
Publish transfers only that review ref and confirms its returned target. Receive
|
|
165
202
|
compares both the advertised and actual fetched raw target with the expected ID,
|
|
166
203
|
requires a commit and recomputable review content, then creates the canonical
|
|
167
|
-
local
|
|
204
|
+
local review ref. A valid same-ID receive is idempotent. A conflicting existing ref
|
|
168
205
|
is refused. Object downloads may remain after refusal. The owned temporary ref
|
|
169
206
|
is removed separately, and cleanup failure is reported without replacing a
|
|
170
207
|
primary failure.
|
|
@@ -183,6 +220,9 @@ or cleanup authority. Opening a reconstruction remains a separate operation.
|
|
|
183
220
|
External packages can expose a zero-argument factory through the
|
|
184
221
|
`gr2.platform_adapters` entry-point group. See [the adapter contract](docs/PR-LIFECYCLE.md#51-adapter-protocol-and-capabilities)
|
|
185
222
|
for registration, optional operation capabilities and merge head-pin requirements.
|
|
223
|
+
What changed in that protocol, release by release, ships in the package: read it from
|
|
224
|
+
an install with `importlib.resources.files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md"`,
|
|
225
|
+
or in this repository at [gr2/PLATFORM_ADAPTER_CHANGELOG.md](gr2/PLATFORM_ADAPTER_CHANGELOG.md).
|
|
186
226
|
Select the installed adapter with `gr2 pr create ... --platform NAME` on a
|
|
187
227
|
materialized lane. The bound-lane path currently pushes and returns its receipt.
|
|
188
228
|
|
|
@@ -217,6 +257,12 @@ The read JSON contains `status`, `record_id` (the head's record-set blob id or
|
|
|
217
257
|
null), `snapshot_oid`, `head`, `member_key`, `records`, and `reason`. Each
|
|
218
258
|
observation retains its fields and adds a SHA-256 `observation_id`.
|
|
219
259
|
|
|
260
|
+
A review over several members is checked as one set. `gr2 check set <workspace> <review> -- <command>`
|
|
261
|
+
reconstructs every member at its pinned head side by side (`GR2_SET_ROOT`, `GR2_REVIEW_ID` and `GR2_SET_MEMBERS`
|
|
262
|
+
name them), runs the command once, and publishes one `set` observation per member remote, carrying the review and the
|
|
263
|
+
identity of the set. `gr2 review merge` requires that record on a multi-member review (`--no-set` says otherwise),
|
|
264
|
+
and `check show --require set --review <id>` reads a `set` record for another review as stale.
|
|
265
|
+
|
|
220
266
|
A failed command is recorded and `check run` exits 1. Publication or execution
|
|
221
267
|
refusals exit 2. `check show` returns `pass`, `fail` or `absent` in its JSON;
|
|
222
268
|
failed or unmeasurable reads exit 2. Conflicting pass and fail observations both
|
|
@@ -225,13 +271,13 @@ failure at that commit. Concurrent writes union observations with bounded
|
|
|
225
271
|
compare-and-swap retries. An unmeasurable push acknowledgement is reported as
|
|
226
272
|
indeterminate unless a fresh remote read confirms the observation.
|
|
227
273
|
|
|
228
|
-
## Merge a
|
|
274
|
+
## Merge a pinned review into plain Git remotes
|
|
229
275
|
|
|
230
276
|
```sh
|
|
231
277
|
gr2 review merge
|
|
232
278
|
```
|
|
233
279
|
|
|
234
|
-
This merges the review
|
|
280
|
+
This merges the review pinned at the members' current heads, from their current branch, into the
|
|
235
281
|
branch on each remote that still sits at the reviewed base, and prints what it resolved. If several
|
|
236
282
|
branches sit there, it asks for `--into`. It merges only if every member's remote feature
|
|
237
283
|
branch is still the reviewed head, the target is still the reviewed base, and the exact-head check
|
|
@@ -243,7 +289,7 @@ Exit codes:
|
|
|
243
289
|
- 3: none merged (refused);
|
|
244
290
|
- 4: partial or unknown.
|
|
245
291
|
|
|
246
|
-
A review id, `--from` and `--into` override the defaults. Zero or several matching
|
|
292
|
+
A review id, `--from` and `--into` override the defaults. Zero or several matching pinned reviews, or members on
|
|
247
293
|
different branches, refuse and name the value to pass.
|
|
248
294
|
|
|
249
295
|
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
|
|
|
@@ -61,11 +63,14 @@ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
|
|
|
61
63
|
```bash
|
|
62
64
|
gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
|
|
63
65
|
gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
|
|
66
|
+
gr2 lane push ~/ws default feat-x # push every lane repo, each verified on its remote
|
|
64
67
|
gr2 lane show ~/ws default # where am I?
|
|
65
68
|
gr2 lane exit ~/ws default --actor human:you
|
|
69
|
+
gr2 lane list ~/ws # each lane: removable, or keep and why
|
|
70
|
+
gr2 lane remove ~/ws default feat-x # end it: its clones and record go
|
|
66
71
|
```
|
|
67
72
|
|
|
68
|
-
`exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
|
|
73
|
+
`lane remove` refuses while the lane is entered or leased, or was made by `lane bind`, while any of its repos holds uncommitted work, a stash, or a commit no remote has (on any branch or tag), or while its checkout holds anything that is not one of its repos; it names each one and removes nothing. `exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
|
|
69
74
|
|
|
70
75
|
## What works today, and what is not there yet
|
|
71
76
|
|
|
@@ -85,20 +90,52 @@ Not there yet:
|
|
|
85
90
|
|
|
86
91
|
| Group | Verbs |
|
|
87
92
|
|---|---|
|
|
88
|
-
| `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1, gitinclude |
|
|
93
|
+
| `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, retire-gr1, migrate-lane-state, bootstrap-gr1, gitinclude |
|
|
89
94
|
| `spec` | show, validate |
|
|
90
|
-
| `lane` | create, enter, exit, show, resolve, bind, lease |
|
|
95
|
+
| `lane` | create, enter, exit, show, resolve, bind, lease, list, push, remove |
|
|
91
96
|
| (top level) | branch, add, commit, push, prune, status, plan, apply |
|
|
92
97
|
| `sync` | status, run |
|
|
93
98
|
| `pr` | create, status, checks, merge, view |
|
|
94
|
-
| `check` | run, show |
|
|
95
|
-
| `review` | open, close, checkout-pr, run, check,
|
|
99
|
+
| `check` | run, show, set |
|
|
100
|
+
| `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
|
|
96
101
|
| `exec` | status, run |
|
|
97
102
|
| `repo` | status, projection-run |
|
|
98
103
|
| `hooks` | trust, revoke, status, show, run |
|
|
99
104
|
| `store` | init, commit, check, push, status, log, diff, checkout, materialize, migrate, migrate-reviews |
|
|
100
105
|
| `target`, `config` | stored PR target; config overlays |
|
|
101
106
|
|
|
107
|
+
`review bind`, `review approve` and `review rebind` remain as aliases of `pin`, `stamp` and `repin`.
|
|
108
|
+
|
|
109
|
+
The words these commands use (lane, pin, stamp, repin, gate, review) are defined in [docs/GLOSSARY.md](docs/GLOSSARY.md).
|
|
110
|
+
|
|
111
|
+
## Stamps (unsigned approvals)
|
|
112
|
+
|
|
113
|
+
Inside a workspace with one pinned review matching every member's current head,
|
|
114
|
+
a reviewer stamps it as the workspace's Git `user.name`:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
gr2 review stamp
|
|
118
|
+
gr2 review merge
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The author recorded by the pin, and anyone who authored a commit in its range,
|
|
122
|
+
cannot stamp it. A stamp records an approval; approver names are self-declared and receipts say `signed: false`.
|
|
123
|
+
Repeated stamps by the same name count once. A moved head needs a new pin
|
|
124
|
+
and fresh stamps. Signing is not implemented by these commands.
|
|
125
|
+
|
|
126
|
+
The workspace's `grip.toml` sets the number required before merging:
|
|
127
|
+
|
|
128
|
+
```toml
|
|
129
|
+
[approvals]
|
|
130
|
+
required = 2
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
The default is zero; `review merge --approvals N` can raise the count for that
|
|
134
|
+
run, but cannot lower the workspace policy. With zero required, the merge gate
|
|
135
|
+
skips approval counting. When approvals are required, broken records or different
|
|
136
|
+
chain tips across member remotes refuse before this run pushes a merge. After a refused stamp, rerun
|
|
137
|
+
`review stamp` to read the current chain and retry with a lease.
|
|
138
|
+
|
|
102
139
|
## Overlay substrate
|
|
103
140
|
|
|
104
141
|
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 +154,17 @@ Migration: use `gr2 review check` for compiled review requirements. `review requ
|
|
|
117
154
|
remains a hidden alias with a warning on stderr until beta. Both report `satisfied`
|
|
118
155
|
in the same JSON payload, and a missing reviewer remains a reported status with exit 0.
|
|
119
156
|
|
|
120
|
-
A bare `gr2 review open <workspace>` uses the workspace's sole review
|
|
157
|
+
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
158
|
|
|
122
|
-
New
|
|
159
|
+
New pinned reviews record the author's Git `user.name` from the workspace root.
|
|
123
160
|
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
|
|
161
|
+
`review show --json` and `review verify --json` include this author; older pinned reviews
|
|
125
162
|
remain readable without an author field, and reading them does not invent one.
|
|
126
163
|
|
|
127
164
|
|
|
128
165
|
## Transfer a native review
|
|
129
166
|
|
|
130
|
-
Publish an existing
|
|
167
|
+
Publish an existing pinned review and receive it in another native workspace:
|
|
131
168
|
|
|
132
169
|
```bash
|
|
133
170
|
gr2 review publish gr:<full-review-id> --remote https://example.org/workspace.git
|
|
@@ -148,7 +185,7 @@ refused without falling back to context.
|
|
|
148
185
|
Publish transfers only that review ref and confirms its returned target. Receive
|
|
149
186
|
compares both the advertised and actual fetched raw target with the expected ID,
|
|
150
187
|
requires a commit and recomputable review content, then creates the canonical
|
|
151
|
-
local
|
|
188
|
+
local review ref. A valid same-ID receive is idempotent. A conflicting existing ref
|
|
152
189
|
is refused. Object downloads may remain after refusal. The owned temporary ref
|
|
153
190
|
is removed separately, and cleanup failure is reported without replacing a
|
|
154
191
|
primary failure.
|
|
@@ -167,6 +204,9 @@ or cleanup authority. Opening a reconstruction remains a separate operation.
|
|
|
167
204
|
External packages can expose a zero-argument factory through the
|
|
168
205
|
`gr2.platform_adapters` entry-point group. See [the adapter contract](docs/PR-LIFECYCLE.md#51-adapter-protocol-and-capabilities)
|
|
169
206
|
for registration, optional operation capabilities and merge head-pin requirements.
|
|
207
|
+
What changed in that protocol, release by release, ships in the package: read it from
|
|
208
|
+
an install with `importlib.resources.files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md"`,
|
|
209
|
+
or in this repository at [gr2/PLATFORM_ADAPTER_CHANGELOG.md](gr2/PLATFORM_ADAPTER_CHANGELOG.md).
|
|
170
210
|
Select the installed adapter with `gr2 pr create ... --platform NAME` on a
|
|
171
211
|
materialized lane. The bound-lane path currently pushes and returns its receipt.
|
|
172
212
|
|
|
@@ -201,6 +241,12 @@ The read JSON contains `status`, `record_id` (the head's record-set blob id or
|
|
|
201
241
|
null), `snapshot_oid`, `head`, `member_key`, `records`, and `reason`. Each
|
|
202
242
|
observation retains its fields and adds a SHA-256 `observation_id`.
|
|
203
243
|
|
|
244
|
+
A review over several members is checked as one set. `gr2 check set <workspace> <review> -- <command>`
|
|
245
|
+
reconstructs every member at its pinned head side by side (`GR2_SET_ROOT`, `GR2_REVIEW_ID` and `GR2_SET_MEMBERS`
|
|
246
|
+
name them), runs the command once, and publishes one `set` observation per member remote, carrying the review and the
|
|
247
|
+
identity of the set. `gr2 review merge` requires that record on a multi-member review (`--no-set` says otherwise),
|
|
248
|
+
and `check show --require set --review <id>` reads a `set` record for another review as stale.
|
|
249
|
+
|
|
204
250
|
A failed command is recorded and `check run` exits 1. Publication or execution
|
|
205
251
|
refusals exit 2. `check show` returns `pass`, `fail` or `absent` in its JSON;
|
|
206
252
|
failed or unmeasurable reads exit 2. Conflicting pass and fail observations both
|
|
@@ -209,13 +255,13 @@ failure at that commit. Concurrent writes union observations with bounded
|
|
|
209
255
|
compare-and-swap retries. An unmeasurable push acknowledgement is reported as
|
|
210
256
|
indeterminate unless a fresh remote read confirms the observation.
|
|
211
257
|
|
|
212
|
-
## Merge a
|
|
258
|
+
## Merge a pinned review into plain Git remotes
|
|
213
259
|
|
|
214
260
|
```sh
|
|
215
261
|
gr2 review merge
|
|
216
262
|
```
|
|
217
263
|
|
|
218
|
-
This merges the review
|
|
264
|
+
This merges the review pinned at the members' current heads, from their current branch, into the
|
|
219
265
|
branch on each remote that still sits at the reviewed base, and prints what it resolved. If several
|
|
220
266
|
branches sit there, it asks for `--into`. It merges only if every member's remote feature
|
|
221
267
|
branch is still the reviewed head, the target is still the reviewed base, and the exact-head check
|
|
@@ -227,7 +273,7 @@ Exit codes:
|
|
|
227
273
|
- 3: none merged (refused);
|
|
228
274
|
- 4: partial or unknown.
|
|
229
275
|
|
|
230
|
-
A review id, `--from` and `--into` override the defaults. Zero or several matching
|
|
276
|
+
A review id, `--from` and `--into` override the defaults. Zero or several matching pinned reviews, or members on
|
|
231
277
|
different branches, refuse and name the value to pass.
|
|
232
278
|
|
|
233
279
|
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.0a9
|
|
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
|
|
|
@@ -77,11 +79,14 @@ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
|
|
|
77
79
|
```bash
|
|
78
80
|
gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
|
|
79
81
|
gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
|
|
82
|
+
gr2 lane push ~/ws default feat-x # push every lane repo, each verified on its remote
|
|
80
83
|
gr2 lane show ~/ws default # where am I?
|
|
81
84
|
gr2 lane exit ~/ws default --actor human:you
|
|
85
|
+
gr2 lane list ~/ws # each lane: removable, or keep and why
|
|
86
|
+
gr2 lane remove ~/ws default feat-x # end it: its clones and record go
|
|
82
87
|
```
|
|
83
88
|
|
|
84
|
-
`exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
|
|
89
|
+
`lane remove` refuses while the lane is entered or leased, or was made by `lane bind`, while any of its repos holds uncommitted work, a stash, or a commit no remote has (on any branch or tag), or while its checkout holds anything that is not one of its repos; it names each one and removes nothing. `exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
|
|
85
90
|
|
|
86
91
|
## What works today, and what is not there yet
|
|
87
92
|
|
|
@@ -101,20 +106,52 @@ Not there yet:
|
|
|
101
106
|
|
|
102
107
|
| Group | Verbs |
|
|
103
108
|
|---|---|
|
|
104
|
-
| `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1, gitinclude |
|
|
109
|
+
| `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, retire-gr1, migrate-lane-state, bootstrap-gr1, gitinclude |
|
|
105
110
|
| `spec` | show, validate |
|
|
106
|
-
| `lane` | create, enter, exit, show, resolve, bind, lease |
|
|
111
|
+
| `lane` | create, enter, exit, show, resolve, bind, lease, list, push, remove |
|
|
107
112
|
| (top level) | branch, add, commit, push, prune, status, plan, apply |
|
|
108
113
|
| `sync` | status, run |
|
|
109
114
|
| `pr` | create, status, checks, merge, view |
|
|
110
|
-
| `check` | run, show |
|
|
111
|
-
| `review` | open, close, checkout-pr, run, check,
|
|
115
|
+
| `check` | run, show, set |
|
|
116
|
+
| `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
|
|
112
117
|
| `exec` | status, run |
|
|
113
118
|
| `repo` | status, projection-run |
|
|
114
119
|
| `hooks` | trust, revoke, status, show, run |
|
|
115
120
|
| `store` | init, commit, check, push, status, log, diff, checkout, materialize, migrate, migrate-reviews |
|
|
116
121
|
| `target`, `config` | stored PR target; config overlays |
|
|
117
122
|
|
|
123
|
+
`review bind`, `review approve` and `review rebind` remain as aliases of `pin`, `stamp` and `repin`.
|
|
124
|
+
|
|
125
|
+
The words these commands use (lane, pin, stamp, repin, gate, review) are defined in [docs/GLOSSARY.md](docs/GLOSSARY.md).
|
|
126
|
+
|
|
127
|
+
## Stamps (unsigned approvals)
|
|
128
|
+
|
|
129
|
+
Inside a workspace with one pinned review matching every member's current head,
|
|
130
|
+
a reviewer stamps it as the workspace's Git `user.name`:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
gr2 review stamp
|
|
134
|
+
gr2 review merge
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
The author recorded by the pin, and anyone who authored a commit in its range,
|
|
138
|
+
cannot stamp it. A stamp records an approval; approver names are self-declared and receipts say `signed: false`.
|
|
139
|
+
Repeated stamps by the same name count once. A moved head needs a new pin
|
|
140
|
+
and fresh stamps. Signing is not implemented by these commands.
|
|
141
|
+
|
|
142
|
+
The workspace's `grip.toml` sets the number required before merging:
|
|
143
|
+
|
|
144
|
+
```toml
|
|
145
|
+
[approvals]
|
|
146
|
+
required = 2
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The default is zero; `review merge --approvals N` can raise the count for that
|
|
150
|
+
run, but cannot lower the workspace policy. With zero required, the merge gate
|
|
151
|
+
skips approval counting. When approvals are required, broken records or different
|
|
152
|
+
chain tips across member remotes refuse before this run pushes a merge. After a refused stamp, rerun
|
|
153
|
+
`review stamp` to read the current chain and retry with a lease.
|
|
154
|
+
|
|
118
155
|
## Overlay substrate
|
|
119
156
|
|
|
120
157
|
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 +170,17 @@ Migration: use `gr2 review check` for compiled review requirements. `review requ
|
|
|
133
170
|
remains a hidden alias with a warning on stderr until beta. Both report `satisfied`
|
|
134
171
|
in the same JSON payload, and a missing reviewer remains a reported status with exit 0.
|
|
135
172
|
|
|
136
|
-
A bare `gr2 review open <workspace>` uses the workspace's sole review
|
|
173
|
+
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
174
|
|
|
138
|
-
New
|
|
175
|
+
New pinned reviews record the author's Git `user.name` from the workspace root.
|
|
139
176
|
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
|
|
177
|
+
`review show --json` and `review verify --json` include this author; older pinned reviews
|
|
141
178
|
remain readable without an author field, and reading them does not invent one.
|
|
142
179
|
|
|
143
180
|
|
|
144
181
|
## Transfer a native review
|
|
145
182
|
|
|
146
|
-
Publish an existing
|
|
183
|
+
Publish an existing pinned review and receive it in another native workspace:
|
|
147
184
|
|
|
148
185
|
```bash
|
|
149
186
|
gr2 review publish gr:<full-review-id> --remote https://example.org/workspace.git
|
|
@@ -164,7 +201,7 @@ refused without falling back to context.
|
|
|
164
201
|
Publish transfers only that review ref and confirms its returned target. Receive
|
|
165
202
|
compares both the advertised and actual fetched raw target with the expected ID,
|
|
166
203
|
requires a commit and recomputable review content, then creates the canonical
|
|
167
|
-
local
|
|
204
|
+
local review ref. A valid same-ID receive is idempotent. A conflicting existing ref
|
|
168
205
|
is refused. Object downloads may remain after refusal. The owned temporary ref
|
|
169
206
|
is removed separately, and cleanup failure is reported without replacing a
|
|
170
207
|
primary failure.
|
|
@@ -183,6 +220,9 @@ or cleanup authority. Opening a reconstruction remains a separate operation.
|
|
|
183
220
|
External packages can expose a zero-argument factory through the
|
|
184
221
|
`gr2.platform_adapters` entry-point group. See [the adapter contract](docs/PR-LIFECYCLE.md#51-adapter-protocol-and-capabilities)
|
|
185
222
|
for registration, optional operation capabilities and merge head-pin requirements.
|
|
223
|
+
What changed in that protocol, release by release, ships in the package: read it from
|
|
224
|
+
an install with `importlib.resources.files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md"`,
|
|
225
|
+
or in this repository at [gr2/PLATFORM_ADAPTER_CHANGELOG.md](gr2/PLATFORM_ADAPTER_CHANGELOG.md).
|
|
186
226
|
Select the installed adapter with `gr2 pr create ... --platform NAME` on a
|
|
187
227
|
materialized lane. The bound-lane path currently pushes and returns its receipt.
|
|
188
228
|
|
|
@@ -217,6 +257,12 @@ The read JSON contains `status`, `record_id` (the head's record-set blob id or
|
|
|
217
257
|
null), `snapshot_oid`, `head`, `member_key`, `records`, and `reason`. Each
|
|
218
258
|
observation retains its fields and adds a SHA-256 `observation_id`.
|
|
219
259
|
|
|
260
|
+
A review over several members is checked as one set. `gr2 check set <workspace> <review> -- <command>`
|
|
261
|
+
reconstructs every member at its pinned head side by side (`GR2_SET_ROOT`, `GR2_REVIEW_ID` and `GR2_SET_MEMBERS`
|
|
262
|
+
name them), runs the command once, and publishes one `set` observation per member remote, carrying the review and the
|
|
263
|
+
identity of the set. `gr2 review merge` requires that record on a multi-member review (`--no-set` says otherwise),
|
|
264
|
+
and `check show --require set --review <id>` reads a `set` record for another review as stale.
|
|
265
|
+
|
|
220
266
|
A failed command is recorded and `check run` exits 1. Publication or execution
|
|
221
267
|
refusals exit 2. `check show` returns `pass`, `fail` or `absent` in its JSON;
|
|
222
268
|
failed or unmeasurable reads exit 2. Conflicting pass and fail observations both
|
|
@@ -225,13 +271,13 @@ failure at that commit. Concurrent writes union observations with bounded
|
|
|
225
271
|
compare-and-swap retries. An unmeasurable push acknowledgement is reported as
|
|
226
272
|
indeterminate unless a fresh remote read confirms the observation.
|
|
227
273
|
|
|
228
|
-
## Merge a
|
|
274
|
+
## Merge a pinned review into plain Git remotes
|
|
229
275
|
|
|
230
276
|
```sh
|
|
231
277
|
gr2 review merge
|
|
232
278
|
```
|
|
233
279
|
|
|
234
|
-
This merges the review
|
|
280
|
+
This merges the review pinned at the members' current heads, from their current branch, into the
|
|
235
281
|
branch on each remote that still sits at the reviewed base, and prints what it resolved. If several
|
|
236
282
|
branches sit there, it asks for `--into`. It merges only if every member's remote feature
|
|
237
283
|
branch is still the reviewed head, the target is still the reviewed base, and the exact-head check
|
|
@@ -243,7 +289,7 @@ Exit codes:
|
|
|
243
289
|
- 3: none merged (refused);
|
|
244
290
|
- 4: partial or unknown.
|
|
245
291
|
|
|
246
|
-
A review id, `--from` and `--into` override the defaults. Zero or several matching
|
|
292
|
+
A review id, `--from` and `--into` override the defaults. Zero or several matching pinned reviews, or members on
|
|
247
293
|
different branches, refuse and name the value to pass.
|
|
248
294
|
|
|
249
295
|
These records are attestations by writers trusted with remote access, not signed
|