gitgrip 2.0.0a8__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.0a8 → gitgrip-2.0.0a9}/PKG-INFO +14 -5
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/README.md +13 -4
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gitgrip.egg-info/PKG-INFO +14 -5
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gitgrip.egg-info/SOURCES.txt +59 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/PLATFORM_ADAPTER_CHANGELOG.md +32 -2
- {gitgrip-2.0.0a8 → 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.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/app.py +507 -29
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/approvals.py +18 -1
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/consent.py +63 -30
- gitgrip-2.0.0a9/gr2/python_cli/declared_sets.py +217 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/execops.py +20 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/git_review.py +2 -1
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/gitops.py +19 -1
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/grip.py +28 -5
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/grip_cli.py +1269 -56
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/hooks.py +289 -1
- gitgrip-2.0.0a9/gr2/python_cli/member_field_tree.py +202 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/merge_gate.py +180 -6
- gitgrip-2.0.0a9/gr2/python_cli/merge_receipts.py +67 -0
- {gitgrip-2.0.0a8 → 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.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/open_gr_review.py +55 -5
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/platform.py +67 -5
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/pr.py +58 -4
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/push.py +113 -2
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_field_tree.py +134 -29
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_members.py +11 -3
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_run.py +56 -2
- {gitgrip-2.0.0a8 → 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.0a8 → 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.0a8 → gitgrip-2.0.0a9}/pyproject.toml +1 -1
- 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.0a8 → gitgrip-2.0.0a9}/tests/test_api_dump.py +4 -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.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.0a8 → gitgrip-2.0.0a9}/tests/test_gitops_shared.py +8 -2
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr_shadow.py +27 -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_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.0a8 → 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.0a8 → 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.0a8 → gitgrip-2.0.0a9}/tests/test_platform_adapter_plugins.py +2 -0
- gitgrip-2.0.0a9/tests/test_pr_adapter_v2_target.py +377 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_review_subject.py +30 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_push.py +1 -1
- gitgrip-2.0.0a9/tests/test_retire_gr1.py +137 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_a4_v2.py +57 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_approvals.py +86 -1
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_author.py +16 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_close_keeps_local_work.py +221 -1
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_merge_gate.py +118 -4
- {gitgrip-2.0.0a8 → 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.0a8 → gitgrip-2.0.0a9}/tests/test_review_open_lane.py +59 -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.0a8 → 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.0a8 → 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.0a8 → 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.0a8 → 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.0a8 → 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.0a8 → gitgrip-2.0.0a9}/tests/test_store_verb_witnesses.py +212 -7
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_version_static.py +2 -2
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_convert_clone.py +196 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gitgrip.egg-info/dependency_links.txt +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gitgrip.egg-info/entry_points.txt +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gitgrip.egg-info/requires.txt +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gitgrip.egg-info/top_level.txt +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/__init__.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/api_core.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/__init__.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/activate.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/agent_manifest.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/cli.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/cross_repo.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/drivers.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/introspection.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/language_drivers.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/objects.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/perf.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/refs.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/trust.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/types.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/units.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/workspace_spec.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/__init__.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/cache_materialization_probe.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/concurrent_event_stress.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/concurrent_lease_stress.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/concurrent_workspace_cap_stress.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/contribution_protocol.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/cross_mode_lane_stress.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/jsonl_store.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/lane_workspace_prototype.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/layout_model_probe.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/propagation_daemon.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/propagation_state_machine.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/python_exec_playground.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/python_hook_runtime_playground.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/python_migration_playground.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/python_review_checkout_playground.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/python_spec_apply_playground.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/real_git_lane_materialization.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/real_git_playground.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/recall_lane_history.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/repo_transport_probe.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/__init__.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/__main__.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/add.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/approval_schema.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/branch.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/channel_bridge.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/check_records.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/clone_exec.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/commit.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/config.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/context.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/defaults.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/ecosystems_python.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/env_exec.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/events.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/exit_codes.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/failures.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/file_exec.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/gitinclude.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/gr_resolver.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/gr_shadow.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/lane_defaults.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/lane_downstream.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/lane_graph.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/lane_plugins.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/launch_exec.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/layout.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/merge_verification.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/project_review.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/prune.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_allocation.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_dispatch.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_ephemeral.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_rebind.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_records.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_runners.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/staging_cleanup.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/syncops.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/target.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/version.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/workspace_guidance.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/workspace_snapshot.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.approval.v1alpha1/approval.proto +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.approval.v1alpha1/descriptor_set.pb +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.check.v1alpha1/check.proto +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.check.v1alpha1/descriptor_set.pb +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.merge.v1alpha1/descriptor_set.pb +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.merge.v1alpha1/merge.proto +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.review.v1alpha1/descriptor_set.pb +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.review.v1alpha1/review.proto +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/gr2-materialization-plan-v1.schema.json +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/gr2-workspace-spec-v1.schema.json +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2_overlay/__init__.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/setup.cfg +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_add.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_agent_manifest_overlay_source.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_api_core_seam.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_app_event_outcomes.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_apply_convergence.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_apply_gr1_sibling_adoption.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_approval_schema.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_branch.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_break_17_unit_path_containment.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_break_18_gr1_sibling_units.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_channel_bridge.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_cli_adapter_error_boundary.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_cli_shape_witnesses.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_clone_materialization.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_commit.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_config_base_path_guard.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_config_overlay.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_conftest_git_isolation.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_context_resolver.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_contribution_protocol.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_defaults_from_repo.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_deprecation_registry.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_ecosystems_python.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_ensure_lane_checkout_reference_clone.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_env_materialization.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_event_log_integrity.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_event_outcome_policy.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_events.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_events_torn_line.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_exec_apostrophe_and_oserror.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_exec_single_string_and_materialize_plan.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_execops.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_failure_event_outcome.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_field_tree_name.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_first_five_minutes.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_foreground_launch_runtime.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_git_review.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gitinclude_compiler.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr1_first_run_guidance.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr2_packaging.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr2_review_receipt.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr_installed_wheel.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr_resolved_cleared.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr_resolver_conformance.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_grip_cli.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_grip_hardening.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_grip_snapshot.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_grip_toml_schema_v1.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_hook_events.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_hook_hardening.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_hooks_consent.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_hooks_group_names.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_jsonl_store.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_checkout_root.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_create_defaults.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_create_fork_base_cli.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_create_refusal_leaves_nothing.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_create_refuses_own_branch.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_downstream.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_downstream_run.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_enter_hook_warnings.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_exit_keeps_dirty_work.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_graph.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_lease_show_json.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_lifecycle_safety.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_plugins.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_probe.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_probe_batch.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_repo_paths_and_all_skipped.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_roles.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_show_name.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_store_path_pins.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_toml_serialization.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_launch_primitive.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_layout_census.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_linked_review_receipts.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_m2_overlay_hindsight.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_m2_overlay_mem0.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_m2_overlay_zep.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_materialization_plan_contract.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_materialize_pin.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_member_working_root_checkout_materialize.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_merge_evidence.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_merge_parent_verification.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_migration.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_migration_overlay_compatibility.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_native_store_review_record_probes.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_no_bare_python_cli_imports.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_null_current_lane_refusal.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_open_gr_enter.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_open_project_refusal_reason_cli.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_outbox_ack_after_effect.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_acceptance.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_activate.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_cli.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_cli_wiring.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_composition_merge.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_cross_repo_atomic_apply.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_cross_repo_perf_gate.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_cross_repo_rollback.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_driver_registry.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_introspection.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_multi_stack.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_object_encoding.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_perf_gates.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_python_driver.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_encoding.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_perf_gates.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_repo_state.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_staging_discipline.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_trust_model.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_workspace_spec.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_platform_adapter_changelog.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_events.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_group_legibility.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_merge_head_pin.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_merge_method.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_merge_missing_target.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_merge_partial_failure.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_view.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_project_file_materialization.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_project_review_range_reconstruction.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_project_review_three_repo.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_projection_tracked_dest.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_propagation_contribution.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_propagation_daemon.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_propagation_state_machine.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_prune.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_python_group_install.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_readme_verbs_exist.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_record_schema_copies.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_remote_check_records.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_repo_path_read_through.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_repo_status_linked_worktree.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_repo_status_schema_version.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_repo_status_symlinked_git_dir.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_a4.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_a4_v3.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_allocation_recovery.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_ansi_parse.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_b3_reader_alignment.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_fork_base.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_from_range.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_migration.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_native_store.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_root_refs.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_verify.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_check_name.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_cli.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_close_gr.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_context_defaults.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_context_witnesses.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_create_project_cli.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_dispatch.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_ephemeral.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_events.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_field_tree.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_field_tree_reader_edges.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_field_tree_readers.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_install_hint.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_pin_stamp_names.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_pr_marker_context.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_reader_defaults.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_rebind.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_receipt_cleanup.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_ref_v1_migration.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_ref_v1_reader.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_ref_v1_writer.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_remote_safety.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_context.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_dependency_order.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_import_isolation.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_integrity_recheck.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_multi_repo.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_plugin_order.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_rerun_and_refusal_receipt.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_runners.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_subject.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_transport.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_v1_format_guard.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_verify_inside.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_vocabulary.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_rmtree_or_refuse.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_selected_workspace_commit.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_single_repo_cwd_refusal.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_snapshot_id_prefix_resolution.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_spec_apply_event_outcomes.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_spec_declaration_ref_pin.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sprint21_sync_platform.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_staging_cleanup.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_checkout_atomicity.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_declared_members.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_init_branch_inference.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_log_adoption_boundary.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_member_path_hygiene.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_member_state.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_migrate_branch_inference.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_moved_workspace_guard.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_verb_rename.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_submodule_member_predicate.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_superproject_import.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sync_event_outcomes.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sync_fast_forward.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sync_fetch.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sync_seed_local.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sync_ssh_rewrite.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sync_status_probe.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_target.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_tmux_launch_runtime.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_unit_abort.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_unit_apply.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_unit_apply_dry_run.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_unit_manifest_schema.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_unit_propose.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_unit_topological_apply.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_validate_repo_path_conflict.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_version_identity.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_vocabulary.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_edit_lease_cap.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_identity_boundary.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_init_from_topology.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_init_local_repos.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_root_defaults.py +0 -0
- {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_root_nearest_marker.py +0 -0
- {gitgrip-2.0.0a8 → 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
|
|
@@ -79,11 +79,14 @@ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
|
|
|
79
79
|
```bash
|
|
80
80
|
gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
|
|
81
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
|
|
82
83
|
gr2 lane show ~/ws default # where am I?
|
|
83
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
|
|
84
87
|
```
|
|
85
88
|
|
|
86
|
-
`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.
|
|
87
90
|
|
|
88
91
|
## What works today, and what is not there yet
|
|
89
92
|
|
|
@@ -103,13 +106,13 @@ Not there yet:
|
|
|
103
106
|
|
|
104
107
|
| Group | Verbs |
|
|
105
108
|
|---|---|
|
|
106
|
-
| `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 |
|
|
107
110
|
| `spec` | show, validate |
|
|
108
|
-
| `lane` | create, enter, exit, show, resolve, bind, lease |
|
|
111
|
+
| `lane` | create, enter, exit, show, resolve, bind, lease, list, push, remove |
|
|
109
112
|
| (top level) | branch, add, commit, push, prune, status, plan, apply |
|
|
110
113
|
| `sync` | status, run |
|
|
111
114
|
| `pr` | create, status, checks, merge, view |
|
|
112
|
-
| `check` | run, show |
|
|
115
|
+
| `check` | run, show, set |
|
|
113
116
|
| `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
|
|
114
117
|
| `exec` | status, run |
|
|
115
118
|
| `repo` | status, projection-run |
|
|
@@ -254,6 +257,12 @@ The read JSON contains `status`, `record_id` (the head's record-set blob id or
|
|
|
254
257
|
null), `snapshot_oid`, `head`, `member_key`, `records`, and `reason`. Each
|
|
255
258
|
observation retains its fields and adds a SHA-256 `observation_id`.
|
|
256
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
|
+
|
|
257
266
|
A failed command is recorded and `check run` exits 1. Publication or execution
|
|
258
267
|
refusals exit 2. `check show` returns `pass`, `fail` or `absent` in its JSON;
|
|
259
268
|
failed or unmeasurable reads exit 2. Conflicting pass and fail observations both
|
|
@@ -63,11 +63,14 @@ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
|
|
|
63
63
|
```bash
|
|
64
64
|
gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
|
|
65
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
|
|
66
67
|
gr2 lane show ~/ws default # where am I?
|
|
67
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
|
|
68
71
|
```
|
|
69
72
|
|
|
70
|
-
`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.
|
|
71
74
|
|
|
72
75
|
## What works today, and what is not there yet
|
|
73
76
|
|
|
@@ -87,13 +90,13 @@ Not there yet:
|
|
|
87
90
|
|
|
88
91
|
| Group | Verbs |
|
|
89
92
|
|---|---|
|
|
90
|
-
| `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 |
|
|
91
94
|
| `spec` | show, validate |
|
|
92
|
-
| `lane` | create, enter, exit, show, resolve, bind, lease |
|
|
95
|
+
| `lane` | create, enter, exit, show, resolve, bind, lease, list, push, remove |
|
|
93
96
|
| (top level) | branch, add, commit, push, prune, status, plan, apply |
|
|
94
97
|
| `sync` | status, run |
|
|
95
98
|
| `pr` | create, status, checks, merge, view |
|
|
96
|
-
| `check` | run, show |
|
|
99
|
+
| `check` | run, show, set |
|
|
97
100
|
| `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
|
|
98
101
|
| `exec` | status, run |
|
|
99
102
|
| `repo` | status, projection-run |
|
|
@@ -238,6 +241,12 @@ The read JSON contains `status`, `record_id` (the head's record-set blob id or
|
|
|
238
241
|
null), `snapshot_oid`, `head`, `member_key`, `records`, and `reason`. Each
|
|
239
242
|
observation retains its fields and adds a SHA-256 `observation_id`.
|
|
240
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
|
+
|
|
241
250
|
A failed command is recorded and `check run` exits 1. Publication or execution
|
|
242
251
|
refusals exit 2. `check show` returns `pass`, `fail` or `absent` in its JSON;
|
|
243
252
|
failed or unmeasurable reads exit 2. Conflicting pass and fail observations both
|
|
@@ -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
|
|
@@ -79,11 +79,14 @@ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
|
|
|
79
79
|
```bash
|
|
80
80
|
gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
|
|
81
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
|
|
82
83
|
gr2 lane show ~/ws default # where am I?
|
|
83
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
|
|
84
87
|
```
|
|
85
88
|
|
|
86
|
-
`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.
|
|
87
90
|
|
|
88
91
|
## What works today, and what is not there yet
|
|
89
92
|
|
|
@@ -103,13 +106,13 @@ Not there yet:
|
|
|
103
106
|
|
|
104
107
|
| Group | Verbs |
|
|
105
108
|
|---|---|
|
|
106
|
-
| `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 |
|
|
107
110
|
| `spec` | show, validate |
|
|
108
|
-
| `lane` | create, enter, exit, show, resolve, bind, lease |
|
|
111
|
+
| `lane` | create, enter, exit, show, resolve, bind, lease, list, push, remove |
|
|
109
112
|
| (top level) | branch, add, commit, push, prune, status, plan, apply |
|
|
110
113
|
| `sync` | status, run |
|
|
111
114
|
| `pr` | create, status, checks, merge, view |
|
|
112
|
-
| `check` | run, show |
|
|
115
|
+
| `check` | run, show, set |
|
|
113
116
|
| `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
|
|
114
117
|
| `exec` | status, run |
|
|
115
118
|
| `repo` | status, projection-run |
|
|
@@ -254,6 +257,12 @@ The read JSON contains `status`, `record_id` (the head's record-set blob id or
|
|
|
254
257
|
null), `snapshot_oid`, `head`, `member_key`, `records`, and `reason`. Each
|
|
255
258
|
observation retains its fields and adds a SHA-256 `observation_id`.
|
|
256
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
|
+
|
|
257
266
|
A failed command is recorded and `check run` exits 1. Publication or execution
|
|
258
267
|
refusals exit 2. `check show` returns `pass`, `fail` or `absent` in its JSON;
|
|
259
268
|
failed or unmeasurable reads exit 2. Conflicting pass and fail observations both
|
|
@@ -49,6 +49,7 @@ gr2/prototypes/repo_transport_probe.py
|
|
|
49
49
|
gr2/python_cli/__init__.py
|
|
50
50
|
gr2/python_cli/__main__.py
|
|
51
51
|
gr2/python_cli/add.py
|
|
52
|
+
gr2/python_cli/agent_record.py
|
|
52
53
|
gr2/python_cli/app.py
|
|
53
54
|
gr2/python_cli/approval_schema.py
|
|
54
55
|
gr2/python_cli/approvals.py
|
|
@@ -60,6 +61,7 @@ gr2/python_cli/commit.py
|
|
|
60
61
|
gr2/python_cli/config.py
|
|
61
62
|
gr2/python_cli/consent.py
|
|
62
63
|
gr2/python_cli/context.py
|
|
64
|
+
gr2/python_cli/declared_sets.py
|
|
63
65
|
gr2/python_cli/defaults.py
|
|
64
66
|
gr2/python_cli/ecosystems_python.py
|
|
65
67
|
gr2/python_cli/env_exec.py
|
|
@@ -82,9 +84,13 @@ gr2/python_cli/lane_graph.py
|
|
|
82
84
|
gr2/python_cli/lane_plugins.py
|
|
83
85
|
gr2/python_cli/launch_exec.py
|
|
84
86
|
gr2/python_cli/layout.py
|
|
87
|
+
gr2/python_cli/member_field_tree.py
|
|
85
88
|
gr2/python_cli/merge_gate.py
|
|
89
|
+
gr2/python_cli/merge_receipts.py
|
|
86
90
|
gr2/python_cli/merge_verification.py
|
|
87
91
|
gr2/python_cli/migration.py
|
|
92
|
+
gr2/python_cli/names.py
|
|
93
|
+
gr2/python_cli/next_steps.py
|
|
88
94
|
gr2/python_cli/open_gr_review.py
|
|
89
95
|
gr2/python_cli/platform.py
|
|
90
96
|
gr2/python_cli/pr.py
|
|
@@ -102,12 +108,16 @@ gr2/python_cli/review_records.py
|
|
|
102
108
|
gr2/python_cli/review_run.py
|
|
103
109
|
gr2/python_cli/review_runners.py
|
|
104
110
|
gr2/python_cli/root_option.py
|
|
111
|
+
gr2/python_cli/set_check.py
|
|
112
|
+
gr2/python_cli/set_hints.py
|
|
105
113
|
gr2/python_cli/spec_apply.py
|
|
106
114
|
gr2/python_cli/staging_cleanup.py
|
|
115
|
+
gr2/python_cli/store_hooks.py
|
|
107
116
|
gr2/python_cli/syncops.py
|
|
108
117
|
gr2/python_cli/target.py
|
|
109
118
|
gr2/python_cli/version.py
|
|
110
119
|
gr2/python_cli/workspace_guidance.py
|
|
120
|
+
gr2/python_cli/workspace_mode.py
|
|
111
121
|
gr2/python_cli/workspace_snapshot.py
|
|
112
122
|
gr2/schemas/gr2-materialization-plan-v1.schema.json
|
|
113
123
|
gr2/schemas/gr2-workspace-spec-v1.schema.json
|
|
@@ -122,6 +132,9 @@ gr2/schemas/dev.synapt.grip.review.v1alpha1/review.proto
|
|
|
122
132
|
gr2_overlay/__init__.py
|
|
123
133
|
tests/test_add.py
|
|
124
134
|
tests/test_agent_manifest_overlay_source.py
|
|
135
|
+
tests/test_agent_record_append.py
|
|
136
|
+
tests/test_agent_record_fold.py
|
|
137
|
+
tests/test_agent_record_stamps.py
|
|
125
138
|
tests/test_api_core_seam.py
|
|
126
139
|
tests/test_api_dump.py
|
|
127
140
|
tests/test_app_event_outcomes.py
|
|
@@ -139,8 +152,11 @@ tests/test_commit.py
|
|
|
139
152
|
tests/test_config_base_path_guard.py
|
|
140
153
|
tests/test_config_overlay.py
|
|
141
154
|
tests/test_conftest_git_isolation.py
|
|
155
|
+
tests/test_consent_key_paths.py
|
|
142
156
|
tests/test_context_resolver.py
|
|
143
157
|
tests/test_contribution_protocol.py
|
|
158
|
+
tests/test_declared_set_pins.py
|
|
159
|
+
tests/test_declared_sets.py
|
|
144
160
|
tests/test_defaults_from_repo.py
|
|
145
161
|
tests/test_deprecation_registry.py
|
|
146
162
|
tests/test_ecosystems_python.py
|
|
@@ -151,13 +167,17 @@ tests/test_event_outcome_policy.py
|
|
|
151
167
|
tests/test_events.py
|
|
152
168
|
tests/test_events_torn_line.py
|
|
153
169
|
tests/test_exec_apostrophe_and_oserror.py
|
|
170
|
+
tests/test_exec_run_names_what_did_not_run.py
|
|
154
171
|
tests/test_exec_single_string_and_materialize_plan.py
|
|
155
172
|
tests/test_execops.py
|
|
156
173
|
tests/test_failure_event_outcome.py
|
|
157
174
|
tests/test_field_tree_name.py
|
|
175
|
+
tests/test_field_tree_schema_reader.py
|
|
176
|
+
tests/test_files_compose.py
|
|
158
177
|
tests/test_first_five_minutes.py
|
|
159
178
|
tests/test_foreground_launch_runtime.py
|
|
160
179
|
tests/test_git_review.py
|
|
180
|
+
tests/test_git_transport_allow_list.py
|
|
161
181
|
tests/test_gitinclude_compiler.py
|
|
162
182
|
tests/test_gitops_shared.py
|
|
163
183
|
tests/test_gr1_first_run_guidance.py
|
|
@@ -170,11 +190,14 @@ tests/test_gr_shadow.py
|
|
|
170
190
|
tests/test_grip_cli.py
|
|
171
191
|
tests/test_grip_hardening.py
|
|
172
192
|
tests/test_grip_snapshot.py
|
|
193
|
+
tests/test_grip_toml_literals.py
|
|
173
194
|
tests/test_grip_toml_schema_v1.py
|
|
174
195
|
tests/test_hook_events.py
|
|
175
196
|
tests/test_hook_hardening.py
|
|
176
197
|
tests/test_hooks_consent.py
|
|
177
198
|
tests/test_hooks_group_names.py
|
|
199
|
+
tests/test_hostile_names.py
|
|
200
|
+
tests/test_hostile_names_helper.py
|
|
178
201
|
tests/test_jsonl_store.py
|
|
179
202
|
tests/test_lane_checkout_root.py
|
|
180
203
|
tests/test_lane_create_defaults.py
|
|
@@ -191,6 +214,8 @@ tests/test_lane_lifecycle_safety.py
|
|
|
191
214
|
tests/test_lane_plugins.py
|
|
192
215
|
tests/test_lane_probe.py
|
|
193
216
|
tests/test_lane_probe_batch.py
|
|
217
|
+
tests/test_lane_push.py
|
|
218
|
+
tests/test_lane_remove.py
|
|
194
219
|
tests/test_lane_repo_paths_and_all_skipped.py
|
|
195
220
|
tests/test_lane_roles.py
|
|
196
221
|
tests/test_lane_show_name.py
|
|
@@ -202,20 +227,25 @@ tests/test_linked_review_receipts.py
|
|
|
202
227
|
tests/test_m2_overlay_hindsight.py
|
|
203
228
|
tests/test_m2_overlay_mem0.py
|
|
204
229
|
tests/test_m2_overlay_zep.py
|
|
230
|
+
tests/test_malformed_remote_refusal.py
|
|
205
231
|
tests/test_materialization_plan_contract.py
|
|
206
232
|
tests/test_materialize_pin.py
|
|
207
233
|
tests/test_member_working_root_checkout_materialize.py
|
|
208
234
|
tests/test_merge_evidence.py
|
|
209
235
|
tests/test_merge_parent_verification.py
|
|
210
236
|
tests/test_migration.py
|
|
237
|
+
tests/test_migration_desk_state.py
|
|
211
238
|
tests/test_migration_overlay_compatibility.py
|
|
212
239
|
tests/test_migration_unadopted_notice.py
|
|
240
|
+
tests/test_names.py
|
|
213
241
|
tests/test_native_store_gitinclude.py
|
|
214
242
|
tests/test_native_store_review_record_probes.py
|
|
215
243
|
tests/test_no_bare_python_cli_imports.py
|
|
244
|
+
tests/test_np_bench_contract_scenario.py
|
|
216
245
|
tests/test_null_current_lane_refusal.py
|
|
217
246
|
tests/test_open_gr_enter.py
|
|
218
247
|
tests/test_open_project_refusal_reason_cli.py
|
|
248
|
+
tests/test_out_of_set_hint.py
|
|
219
249
|
tests/test_outbox_ack_after_effect.py
|
|
220
250
|
tests/test_overlay_acceptance.py
|
|
221
251
|
tests/test_overlay_activate.py
|
|
@@ -239,6 +269,7 @@ tests/test_overlay_trust_model.py
|
|
|
239
269
|
tests/test_overlay_workspace_spec.py
|
|
240
270
|
tests/test_platform_adapter_changelog.py
|
|
241
271
|
tests/test_platform_adapter_plugins.py
|
|
272
|
+
tests/test_pr_adapter_v2_target.py
|
|
242
273
|
tests/test_pr_events.py
|
|
243
274
|
tests/test_pr_group_legibility.py
|
|
244
275
|
tests/test_pr_merge_head_pin.py
|
|
@@ -264,6 +295,7 @@ tests/test_repo_path_read_through.py
|
|
|
264
295
|
tests/test_repo_status_linked_worktree.py
|
|
265
296
|
tests/test_repo_status_schema_version.py
|
|
266
297
|
tests/test_repo_status_symlinked_git_dir.py
|
|
298
|
+
tests/test_retire_gr1.py
|
|
267
299
|
tests/test_review_a4.py
|
|
268
300
|
tests/test_review_a4_v2.py
|
|
269
301
|
tests/test_review_a4_v3.py
|
|
@@ -294,6 +326,8 @@ tests/test_review_field_tree_readers.py
|
|
|
294
326
|
tests/test_review_install_hint.py
|
|
295
327
|
tests/test_review_merge_gate.py
|
|
296
328
|
tests/test_review_merge_gate_lost_ack.py
|
|
329
|
+
tests/test_review_merge_receipt.py
|
|
330
|
+
tests/test_review_merge_updates_tracking_ref.py
|
|
297
331
|
tests/test_review_open_lane.py
|
|
298
332
|
tests/test_review_pin_stamp_names.py
|
|
299
333
|
tests/test_review_pr_marker_context.py
|
|
@@ -306,12 +340,15 @@ tests/test_review_ref_v1_writer.py
|
|
|
306
340
|
tests/test_review_remote_safety.py
|
|
307
341
|
tests/test_review_run.py
|
|
308
342
|
tests/test_review_run_context.py
|
|
343
|
+
tests/test_review_run_deleted_cwd.py
|
|
309
344
|
tests/test_review_run_dependency_order.py
|
|
310
345
|
tests/test_review_run_import_isolation.py
|
|
311
346
|
tests/test_review_run_integrity_recheck.py
|
|
312
347
|
tests/test_review_run_multi_repo.py
|
|
348
|
+
tests/test_review_run_package_name.py
|
|
313
349
|
tests/test_review_run_plugin_order.py
|
|
314
350
|
tests/test_review_run_rerun_and_refusal_receipt.py
|
|
351
|
+
tests/test_review_run_venv_and_refusal_identity.py
|
|
315
352
|
tests/test_review_runners.py
|
|
316
353
|
tests/test_review_subject.py
|
|
317
354
|
tests/test_review_transport.py
|
|
@@ -321,24 +358,46 @@ tests/test_review_vocabulary.py
|
|
|
321
358
|
tests/test_rmtree_or_refuse.py
|
|
322
359
|
tests/test_root_option_verbs.py
|
|
323
360
|
tests/test_selected_workspace_commit.py
|
|
361
|
+
tests/test_set_check.py
|
|
362
|
+
tests/test_set_check_remote_heads.py
|
|
324
363
|
tests/test_single_repo_cwd_refusal.py
|
|
364
|
+
tests/test_skill_dump.py
|
|
325
365
|
tests/test_snapshot_id_prefix_resolution.py
|
|
326
366
|
tests/test_spec_apply_event_outcomes.py
|
|
327
367
|
tests/test_spec_declaration_ref_pin.py
|
|
368
|
+
tests/test_spec_show_native_root.py
|
|
328
369
|
tests/test_sprint21_sync_platform.py
|
|
329
370
|
tests/test_staging_cleanup.py
|
|
330
371
|
tests/test_store_break_attempts.py
|
|
331
372
|
tests/test_store_checkout_atomicity.py
|
|
373
|
+
tests/test_store_commit_follows_branch.py
|
|
374
|
+
tests/test_store_commit_keeps_record.py
|
|
332
375
|
tests/test_store_commit_noop.py
|
|
376
|
+
tests/test_store_commit_refuses_rewind.py
|
|
333
377
|
tests/test_store_declared_members.py
|
|
378
|
+
tests/test_store_full_mode_carrier.py
|
|
379
|
+
tests/test_store_full_mode_coverage.py
|
|
380
|
+
tests/test_store_full_mode_layers.py
|
|
381
|
+
tests/test_store_full_mode_records.py
|
|
382
|
+
tests/test_store_git_hooks.py
|
|
334
383
|
tests/test_store_git_native_smoke.py
|
|
384
|
+
tests/test_store_gitmodules.py
|
|
385
|
+
tests/test_store_gitmodules_branch.py
|
|
386
|
+
tests/test_store_hook_takes_verb_coverage.py
|
|
335
387
|
tests/test_store_init_branch_inference.py
|
|
388
|
+
tests/test_store_init_clone.py
|
|
336
389
|
tests/test_store_log_adoption_boundary.py
|
|
390
|
+
tests/test_store_materialize_branch.py
|
|
391
|
+
tests/test_store_materialize_fetches_new_pin.py
|
|
392
|
+
tests/test_store_materialize_installs_hooks.py
|
|
337
393
|
tests/test_store_member_path_hygiene.py
|
|
338
394
|
tests/test_store_member_state.py
|
|
339
395
|
tests/test_store_migrate_branch_inference.py
|
|
340
396
|
tests/test_store_moved_workspace_guard.py
|
|
397
|
+
tests/test_store_status_inspection.py
|
|
341
398
|
tests/test_store_status_values.py
|
|
399
|
+
tests/test_store_submodule_init.py
|
|
400
|
+
tests/test_store_submodule_update_merge.py
|
|
342
401
|
tests/test_store_verb_rename.py
|
|
343
402
|
tests/test_store_verb_witnesses.py
|
|
344
403
|
tests/test_submodule_member_predicate.py
|
|
@@ -13,8 +13,38 @@ It covers what an out-of-tree adapter implements or receives: the `PlatformAdapt
|
|
|
13
13
|
Each entry names the release that first carried it. The full release notes for every change are in the
|
|
14
14
|
project's `CHANGELOG.md` and its GitHub releases.
|
|
15
15
|
|
|
16
|
-
`PLATFORM_ADAPTER_API_VERSION` is the protocol's version number. It
|
|
17
|
-
|
|
16
|
+
`PLATFORM_ADAPTER_API_VERSION` is the protocol's version number. It changes only for a change an existing
|
|
17
|
+
adapter cannot absorb. Version `2` is first carried by 2.0.0a9, and later 2.0.0a releases may add to it;
|
|
18
|
+
an adapter that declares version `1`, or nothing, is still accepted and called as before.
|
|
19
|
+
|
|
20
|
+
## 2.0.0a9 (adapter API version 2)
|
|
21
|
+
|
|
22
|
+
An adapter that declares no `platform_adapter_api_version` is a version 1 adapter and is called exactly as
|
|
23
|
+
before.
|
|
24
|
+
|
|
25
|
+
- **`PLATFORM_ADAPTER_API_VERSION = 2`.** gr2 accepts a declared `1` or `2` and refuses any other value.
|
|
26
|
+
`adapter_api_version(adapter)` returns the declaration, and `1` when there is none.
|
|
27
|
+
- **`RemoteTarget`** is new: `raw` (the exact configured Git URL) and the adapter's reading of it, `host`,
|
|
28
|
+
`org`, `project` and `repo`, each `None` when the platform has no such part. gr2 never parses a hosting URL.
|
|
29
|
+
- **`resolve_target(remote) -> RemoteTarget`** is new and is required of a version 2 adapter: it is the only
|
|
30
|
+
place a URL is parsed.
|
|
31
|
+
- **`CreatePRRequest.target`** is new (default `None`): the member's `RemoteTarget`, resolved by the adapter
|
|
32
|
+
before the first PR of a group is created. A version 2 adapter always receives it; a version 1 adapter
|
|
33
|
+
receives `None`. `CreatePRRequest.remote` is unchanged and still carries the raw URL.
|
|
34
|
+
- **`target` keyword on the lifecycle calls.** For a version 2 adapter gr2 passes `target=<that member's
|
|
35
|
+
RemoteTarget>` to `pr_status`, `merge_pr`, `edit_pr_body`, `pr_checks`, `pr_view` and `list_prs`, so the adapter routes by the member's own
|
|
36
|
+
target and not by a repo string. A version 1 adapter is never passed `target`.
|
|
37
|
+
- **Old groups are refused by name.** A version 2 adapter given a stored group whose member has neither a
|
|
38
|
+
`target` nor a `remote` is refused as `group_lacks_routing_context`, before any adapter call; the group is
|
|
39
|
+
re-created with `gr2 pr create`. A member whose stored remote now resolves to a different target than the
|
|
40
|
+
one stored is refused as `routing_target_changed`.
|
|
41
|
+
- **Review verbs.** `review open` reads the PR's base branch through the adapter's own target when the adapter
|
|
42
|
+
is version 2 (`pr_status(..., target=<origin's RemoteTarget>)`), and refuses by name when the repository has
|
|
43
|
+
no origin url; a version 1 adapter is read exactly as before. Review creation resolves each member through
|
|
44
|
+
`resolve_target` and requires the effective URL (after any `url.<base>.insteadOf` rewrite) to resolve to the
|
|
45
|
+
same `(host, org, project, repo)` as the bound one.
|
|
46
|
+
- **Selection refuses a version 2 adapter without `resolve_target`** by name (`platform adapter lacks required
|
|
47
|
+
resolve_target capability`), at the same point it refuses one without `create_pr`.
|
|
18
48
|
|
|
19
49
|
## 2.0.0a8
|
|
20
50
|
|
|
@@ -507,7 +507,10 @@ def declared_repo_state(
|
|
|
507
507
|
branch of record is resolved in the order the ruling names:
|
|
508
508
|
|
|
509
509
|
1. ``declared_ref``, from the workspace's own ``.gitmodules`` when the
|
|
510
|
-
caller supplies it
|
|
510
|
+
caller supplies it -- under the member's LOCAL name when its head is
|
|
511
|
+
attached to a branch configured to track origin's declared branch
|
|
512
|
+
(``branch.<local>.remote`` = origin, ``.merge`` = the declared branch),
|
|
513
|
+
since ``.gitmodules`` names a branch on origin.
|
|
511
514
|
2. the branch the repo is on, when its head is attached.
|
|
512
515
|
3. the remote's default from ``refs/remotes/origin/HEAD``, which git sets
|
|
513
516
|
when it clones -- resolved rather than invented, and used for the
|
|
@@ -534,6 +537,17 @@ def declared_repo_state(
|
|
|
534
537
|
ref: str | None = None
|
|
535
538
|
if declared_ref:
|
|
536
539
|
ref = declared_ref
|
|
540
|
+
# `.gitmodules` names a branch on the member's ORIGIN. A member attached to a local branch configured to track
|
|
541
|
+
# exactly that branch (`branch.<local>.remote` is origin and `.merge` is refs/heads/<declared>) agrees with the
|
|
542
|
+
# declaration under its own name (`mine` tracking `origin/main`, declared `main`), so the local name is the
|
|
543
|
+
# branch of record. Any other upstream, including the same name on another remote (`fork/main`), does not agree,
|
|
544
|
+
# and the declaration still outranks it. Read as configured, so a remapped fetch refspec cannot fool it.
|
|
545
|
+
if is_attached:
|
|
546
|
+
local = attached.stdout.strip().removeprefix("refs/heads/")
|
|
547
|
+
remote = run_git(path, "config", "--get", f"branch.{local}.remote")
|
|
548
|
+
merge = run_git(path, "config", "--get", f"branch.{local}.merge")
|
|
549
|
+
if remote.stdout.strip() == "origin" and merge.stdout.strip() == f"refs/heads/{declared_ref}":
|
|
550
|
+
ref = local
|
|
537
551
|
elif is_attached:
|
|
538
552
|
ref = attached.stdout.strip().removeprefix("refs/heads/")
|
|
539
553
|
else:
|
|
@@ -805,6 +819,40 @@ def swap_in_place(staged: Path, target: Path) -> None:
|
|
|
805
819
|
shutil.move(str(staged), str(target))
|
|
806
820
|
|
|
807
821
|
|
|
822
|
+
def _restore_tracking_refs(staging_path: Path, owner_root: Path, *, keep_origin: bool) -> None:
|
|
823
|
+
"""Make the staging clone's refs/remotes/origin/* what the worktree saw, not what the clone copied.
|
|
824
|
+
|
|
825
|
+
The clone's origin refs are the owner's refs/heads/*; delete them all (no-deref, so the origin/HEAD symref
|
|
826
|
+
itself goes, not its target). When the original had an origin, bring in the owner's own origin tracking refs
|
|
827
|
+
over file://, which is local, and restore its origin/HEAD symref; when it had none there is nothing to bring
|
|
828
|
+
and none are left.
|
|
829
|
+
"""
|
|
830
|
+
listed = run_git(staging_path, "for-each-ref", "--format=%(refname)", "refs/remotes/origin")
|
|
831
|
+
for ref in listed.stdout.split():
|
|
832
|
+
run_git(staging_path, "update-ref", "--no-deref", "-d", ref)
|
|
833
|
+
if not keep_origin:
|
|
834
|
+
return
|
|
835
|
+
got = run_git(
|
|
836
|
+
staging_path, "fetch", "-q", f"file://{owner_root}", "+refs/remotes/origin/*:refs/remotes/origin/*"
|
|
837
|
+
)
|
|
838
|
+
if got.returncode != 0:
|
|
839
|
+
shutil.rmtree(staging_path, ignore_errors=True)
|
|
840
|
+
raise ConvertCloneError(
|
|
841
|
+
f"could not carry the owner's remote-tracking refs into the staging clone: {got.stderr.strip()}"
|
|
842
|
+
)
|
|
843
|
+
# The fetch brings origin/HEAD back as a PLAIN ref holding a sha, and the readers of the remote's default
|
|
844
|
+
# branch (`rev-parse --abbrev-ref origin/HEAD`, `symbolic-ref refs/remotes/origin/HEAD`) need the SYMREF.
|
|
845
|
+
# Put the owner's symref back, when it has one and its target is among the refs just carried; when it
|
|
846
|
+
# has none, there is none here either.
|
|
847
|
+
run_git(staging_path, "update-ref", "--no-deref", "-d", "refs/remotes/origin/HEAD")
|
|
848
|
+
owner_head = run_git(owner_root, "symbolic-ref", "-q", "refs/remotes/origin/HEAD")
|
|
849
|
+
target = owner_head.stdout.strip()
|
|
850
|
+
if owner_head.returncode == 0 and target:
|
|
851
|
+
have = run_git(staging_path, "show-ref", "--verify", "-q", target)
|
|
852
|
+
if have.returncode == 0:
|
|
853
|
+
run_git(staging_path, "symbolic-ref", "refs/remotes/origin/HEAD", target)
|
|
854
|
+
|
|
855
|
+
|
|
808
856
|
def convert_worktree_to_clone(path: Path) -> dict[str, object]:
|
|
809
857
|
"""Convert a linked worktree into an own clone, in place.
|
|
810
858
|
|
|
@@ -933,6 +981,12 @@ def convert_worktree_to_clone(path: Path) -> dict[str, object]:
|
|
|
933
981
|
else:
|
|
934
982
|
run_git(staging_path, "remote", "remove", "origin")
|
|
935
983
|
|
|
984
|
+
# `git clone <owner path>` copied the OWNER's branches as refs/remotes/origin/*, and the real origin was just
|
|
985
|
+
# restored above, so those refs now claim the real origin holds commits that exist only in the owner. A
|
|
986
|
+
# commit the worktree knew was unpushed would read as pushed. Replace them with the refs the worktree itself
|
|
987
|
+
# was reading: the owner's own refs/remotes/origin/*, taken from the owner locally (no network).
|
|
988
|
+
_restore_tracking_refs(staging_path, canonical_repo_root, keep_origin=original_origin is not None)
|
|
989
|
+
|
|
936
990
|
staging_git = staging_path / ".git"
|
|
937
991
|
staging_summary = _lstat_summary(staging_git)
|
|
938
992
|
if not staging_summary["is_dir"]:
|