gitgrip 1.5.1__tar.gz → 2.0.0a2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. gitgrip-2.0.0a2/PKG-INFO +116 -0
  2. gitgrip-2.0.0a2/README.md +101 -0
  3. gitgrip-2.0.0a2/gitgrip.egg-info/PKG-INFO +116 -0
  4. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gitgrip.egg-info/SOURCES.txt +23 -7
  5. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gitgrip.egg-info/entry_points.txt +1 -0
  6. gitgrip-2.0.0a2/gr2/overlay/__init__.py +9 -0
  7. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/concurrent_lease_stress.py +4 -3
  8. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/concurrent_workspace_cap_stress.py +4 -3
  9. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/cross_mode_lane_stress.py +21 -21
  10. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/lane_workspace_prototype.py +41 -12
  11. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/python_exec_playground.py +2 -1
  12. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/python_hook_runtime_playground.py +2 -1
  13. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/python_migration_playground.py +2 -1
  14. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/python_review_checkout_playground.py +2 -1
  15. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/python_spec_apply_playground.py +2 -1
  16. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/real_git_lane_materialization.py +3 -2
  17. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/real_git_playground.py +1 -1
  18. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/pyproject.toml +9 -14
  19. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/app.py +415 -42
  20. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/commit.py +88 -2
  21. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/execops.py +12 -1
  22. gitgrip-2.0.0a2/python_cli/git_review.py +845 -0
  23. gitgrip-2.0.0a2/python_cli/gitops.py +489 -0
  24. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/hooks.py +29 -0
  25. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/launch_exec.py +87 -11
  26. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/migration.py +1 -2
  27. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/project_review.py +3 -3
  28. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/review.py +1 -1
  29. gitgrip-2.0.0a2/python_cli/review_dispatch.py +52 -0
  30. gitgrip-2.0.0a2/python_cli/review_rebind.py +315 -0
  31. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/review_run.py +211 -15
  32. gitgrip-2.0.0a2/python_cli/review_runners.py +292 -0
  33. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/spec_apply.py +6 -1
  34. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/syncops.py +61 -4
  35. gitgrip-2.0.0a2/tests/test_conftest_git_isolation.py +219 -0
  36. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_ensure_lane_checkout_reference_clone.py +1 -1
  37. gitgrip-2.0.0a2/tests/test_exec_apostrophe_and_oserror.py +279 -0
  38. gitgrip-2.0.0a2/tests/test_exec_single_string_and_materialize_plan.py +442 -0
  39. gitgrip-2.0.0a2/tests/test_foreground_launch_runtime.py +155 -0
  40. gitgrip-2.0.0a2/tests/test_git_review.py +873 -0
  41. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_lane_create_fork_base_cli.py +2 -2
  42. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_lane_lifecycle_safety.py +10 -5
  43. gitgrip-2.0.0a2/tests/test_lane_repo_paths_and_all_skipped.py +234 -0
  44. gitgrip-2.0.0a2/tests/test_projection_tracked_dest.py +183 -0
  45. gitgrip-2.0.0a2/tests/test_readme_verbs_exist.py +151 -0
  46. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_bind_fork_base.py +1 -1
  47. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_cli.py +41 -0
  48. gitgrip-2.0.0a2/tests/test_review_dispatch.py +105 -0
  49. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_open_lane.py +7 -2
  50. gitgrip-2.0.0a2/tests/test_review_rebind.py +198 -0
  51. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_run.py +110 -0
  52. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_run_import_isolation.py +9 -3
  53. gitgrip-2.0.0a2/tests/test_review_runners.py +384 -0
  54. gitgrip-2.0.0a2/tests/test_single_repo_cwd_refusal.py +158 -0
  55. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_sprint21_sync_platform.py +27 -0
  56. gitgrip-2.0.0a2/tests/test_store_verb_rename.py +46 -0
  57. gitgrip-2.0.0a2/tests/test_sync_fast_forward.py +238 -0
  58. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_sync_fetch.py +10 -5
  59. gitgrip-2.0.0a2/tests/test_sync_seed_local.py +241 -0
  60. gitgrip-2.0.0a2/tests/test_sync_ssh_rewrite.py +326 -0
  61. gitgrip-2.0.0a2/tests/test_sync_status_probe.py +232 -0
  62. gitgrip-2.0.0a2/tests/test_version_static.py +111 -0
  63. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_workspace_convert_clone.py +1 -1
  64. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_workspace_init_from_topology.py +2 -1
  65. gitgrip-2.0.0a2/tests/test_workspace_init_local_repos.py +120 -0
  66. gitgrip-1.5.1/MANIFEST.in +0 -6
  67. gitgrip-1.5.1/PKG-INFO +0 -13
  68. gitgrip-1.5.1/README.md +0 -258
  69. gitgrip-1.5.1/VERSION +0 -1
  70. gitgrip-1.5.1/_build/__pycache__/backend.cpython-311.pyc +0 -0
  71. gitgrip-1.5.1/_build/__pycache__/version_from_cargo.cpython-311.pyc +0 -0
  72. gitgrip-1.5.1/_build/backend.py +0 -58
  73. gitgrip-1.5.1/_build/version_from_cargo.py +0 -43
  74. gitgrip-1.5.1/gitgrip.egg-info/PKG-INFO +0 -13
  75. gitgrip-1.5.1/gr2/overlay/__init__.py +0 -6
  76. gitgrip-1.5.1/python_cli/gitops.py +0 -226
  77. gitgrip-1.5.1/tests/test_version_single_sourced.py +0 -96
  78. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gitgrip.egg-info/dependency_links.txt +0 -0
  79. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gitgrip.egg-info/requires.txt +0 -0
  80. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gitgrip.egg-info/top_level.txt +0 -0
  81. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/__init__.py +0 -0
  82. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/activate.py +0 -0
  83. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/agent_manifest.py +0 -0
  84. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/cli.py +0 -0
  85. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/cross_repo.py +0 -0
  86. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/drivers.py +0 -0
  87. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/introspection.py +0 -0
  88. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/language_drivers.py +0 -0
  89. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/objects.py +0 -0
  90. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/perf.py +0 -0
  91. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/refs.py +0 -0
  92. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/trust.py +0 -0
  93. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/types.py +0 -0
  94. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/units.py +0 -0
  95. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/workspace_spec.py +0 -0
  96. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/schemas/gr2-materialization-plan-v1.schema.json +0 -0
  97. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2_overlay/__init__.py +0 -0
  98. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/__init__.py +0 -0
  99. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/cache_materialization_probe.py +0 -0
  100. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/concurrent_event_stress.py +0 -0
  101. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/contribution_protocol.py +0 -0
  102. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/jsonl_store.py +0 -0
  103. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/layout_model_probe.py +0 -0
  104. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/propagation_daemon.py +0 -0
  105. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/propagation_state_machine.py +0 -0
  106. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/recall_lane_history.py +0 -0
  107. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/repo_maintenance_prototype.py +0 -0
  108. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/repo_transport_probe.py +0 -0
  109. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/__init__.py +0 -0
  110. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/__main__.py +0 -0
  111. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/add.py +0 -0
  112. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/branch.py +0 -0
  113. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/channel_bridge.py +0 -0
  114. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/clone_exec.py +0 -0
  115. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/config.py +0 -0
  116. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/env_exec.py +0 -0
  117. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/events.py +0 -0
  118. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/failures.py +0 -0
  119. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/file_exec.py +0 -0
  120. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/grip.py +0 -0
  121. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/grip_cli.py +0 -0
  122. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/merge_verification.py +0 -0
  123. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/open_gr_review.py +0 -0
  124. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/platform.py +0 -0
  125. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/pr.py +0 -0
  126. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/prune.py +0 -0
  127. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/push.py +0 -0
  128. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/review_ephemeral.py +0 -0
  129. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/staging_cleanup.py +0 -0
  130. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/target.py +0 -0
  131. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/workspace_snapshot.py +0 -0
  132. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/setup.cfg +0 -0
  133. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_add.py +0 -0
  134. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_agent_manifest_overlay_source.py +0 -0
  135. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_app_event_outcomes.py +0 -0
  136. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_apply_convergence.py +0 -0
  137. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_branch.py +0 -0
  138. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_channel_bridge.py +0 -0
  139. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_clone_materialization.py +0 -0
  140. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_commit.py +0 -0
  141. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_config_base_path_guard.py +0 -0
  142. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_config_overlay.py +0 -0
  143. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_contribution_protocol.py +0 -0
  144. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_env_materialization.py +0 -0
  145. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_event_log_integrity.py +0 -0
  146. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_event_outcome_policy.py +0 -0
  147. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_events.py +0 -0
  148. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_events_torn_line.py +0 -0
  149. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_execops.py +0 -0
  150. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_failure_event_outcome.py +0 -0
  151. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_gr2_packaging.py +0 -0
  152. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_gr2_review_receipt.py +0 -0
  153. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_grip_cli.py +0 -0
  154. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_grip_hardening.py +0 -0
  155. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_grip_object_model.py +0 -0
  156. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_grip_snapshot.py +0 -0
  157. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_hook_events.py +0 -0
  158. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_hook_hardening.py +0 -0
  159. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_jsonl_store.py +0 -0
  160. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_lane_lease_show_json.py +0 -0
  161. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_lane_toml_serialization.py +0 -0
  162. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_launch_primitive.py +0 -0
  163. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_m2_overlay_hindsight.py +0 -0
  164. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_m2_overlay_mem0.py +0 -0
  165. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_m2_overlay_zep.py +0 -0
  166. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_materialization_plan_contract.py +0 -0
  167. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_merge_evidence.py +0 -0
  168. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_merge_parent_verification.py +0 -0
  169. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_migration.py +0 -0
  170. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_migration_overlay_compatibility.py +0 -0
  171. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_no_bare_python_cli_imports.py +0 -0
  172. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_null_current_lane_refusal.py +0 -0
  173. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_open_gr_enter.py +0 -0
  174. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_open_project_refusal_reason_cli.py +0 -0
  175. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_acceptance.py +0 -0
  176. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_activate.py +0 -0
  177. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_cli.py +0 -0
  178. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_cli_wiring.py +0 -0
  179. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_composition_merge.py +0 -0
  180. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_cross_repo_atomic_apply.py +0 -0
  181. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_cross_repo_perf_gate.py +0 -0
  182. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_cross_repo_rollback.py +0 -0
  183. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_driver_registry.py +0 -0
  184. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_introspection.py +0 -0
  185. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_multi_stack.py +0 -0
  186. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_object_encoding.py +0 -0
  187. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_perf_gates.py +0 -0
  188. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_python_driver.py +0 -0
  189. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_tier_b_encoding.py +0 -0
  190. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_tier_b_perf_gates.py +0 -0
  191. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_tier_b_repo_state.py +0 -0
  192. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_tier_b_staging_discipline.py +0 -0
  193. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_trust_model.py +0 -0
  194. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_workspace_spec.py +0 -0
  195. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_pr_events.py +0 -0
  196. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_pr_merge_method.py +0 -0
  197. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_pr_merge_partial_failure.py +0 -0
  198. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_project_file_materialization.py +0 -0
  199. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_project_review_range_reconstruction.py +0 -0
  200. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_project_review_three_repo.py +0 -0
  201. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_propagation_contribution.py +0 -0
  202. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_propagation_daemon.py +0 -0
  203. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_propagation_state_machine.py +0 -0
  204. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_prune.py +0 -0
  205. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_push.py +0 -0
  206. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_repo_status_linked_worktree.py +0 -0
  207. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_repo_status_schema_version.py +0 -0
  208. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_repo_status_symlinked_git_dir.py +0 -0
  209. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_bind_from_range.py +0 -0
  210. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_bind_verify.py +0 -0
  211. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_close_gr.py +0 -0
  212. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_create_project_cli.py +0 -0
  213. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_ephemeral.py +0 -0
  214. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_run_rerun_and_refusal_receipt.py +0 -0
  215. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_verify_inside.py +0 -0
  216. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_rmtree_or_refuse.py +0 -0
  217. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_snapshot_id_prefix_resolution.py +0 -0
  218. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_spec_apply_event_outcomes.py +0 -0
  219. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_staging_cleanup.py +0 -0
  220. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_sync_event_outcomes.py +0 -0
  221. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_target.py +0 -0
  222. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_tmux_launch_runtime.py +0 -0
  223. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_unit_abort.py +0 -0
  224. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_unit_apply.py +0 -0
  225. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_unit_apply_dry_run.py +0 -0
  226. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_unit_manifest_schema.py +0 -0
  227. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_unit_propose.py +0 -0
  228. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_unit_topological_apply.py +0 -0
  229. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_workspace_edit_lease_cap.py +0 -0
  230. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_workspace_identity_boundary.py +0 -0
  231. {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_workspace_snapshot.py +0 -0
@@ -0,0 +1,116 @@
1
+ Metadata-Version: 2.4
2
+ Name: gitgrip
3
+ Version: 2.0.0a2
4
+ Summary: Workspace layer for multi-repo work: workspaces, isolated lanes, and one grouped review per slice
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: typer>=0.9
8
+ Requires-Dist: tomli_w>=1.0
9
+ Requires-Dist: pyyaml>=6.0
10
+ Requires-Dist: toml>=0.10
11
+ Requires-Dist: jsonschema>=4.18
12
+ Provides-Extra: dev
13
+ Requires-Dist: pytest>=8.0; extra == "dev"
14
+ Requires-Dist: ruff>=0.4; extra == "dev"
15
+
16
+ # gr2
17
+
18
+ **gr2 is the workspace layer for multi-repo work.** One repository is just git; when a change spans repositories — a feature slice, a release, several agents touching several repos — gr2 gives you a workspace over them, isolated lanes to work in, and one grouped review/PR set for the slice. It is the Python successor to the Rust `gr` (1.x, called gr1 below); both ship from this repository, and `gr2` is the command for the workspace and the slice.
19
+
20
+ ## Install
21
+
22
+ ```bash
23
+ python3 -m venv ~/gr2-venv && source ~/gr2-venv/bin/activate
24
+ pip install --pre gitgrip # the PyPI package is "gitgrip"; the command is "gr2"
25
+ gr2 --version
26
+ ```
27
+
28
+ `--pre` is required while 2.x is an alpha — without it pip installs 1.5.1, which is gr1. To run unreleased development code instead, install from a checkout: `pip install -e gr2/` from the repository root.
29
+
30
+ The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`. The two do not collide; you can have both installed.
31
+
32
+ ## First five minutes
33
+
34
+ Every command below was run, in this order, in a clean virtualenv against a throwaway workspace of two repositories. Put two clones side by side in one folder, say `~/ws/repo-a` and `~/ws/repo-b`.
35
+
36
+ ```bash
37
+ cd ~/ws
38
+ gr2 workspace init ~/ws # scans the folder; writes .grip/workspace_spec.toml
39
+ gr2 workspace materialize ~/ws --yes # builds the .grip layout and a default unit
40
+ gr2 workspace status ~/ws # what kind of workspace this is
41
+ gr2 store init ~/ws # the workspace snapshot store (needed before review)
42
+ ```
43
+
44
+ A **unit** is one worker — you, or one agent — and `default` is created for you. A **lane** is one piece of work spanning repos, with its own clones, so two lanes never step on each other:
45
+
46
+ ```bash
47
+ gr2 lane create ~/ws default feat-x --repos repo-a,repo-b --branch feat/x
48
+ gr2 lane enter ~/ws default feat-x --actor human:you
49
+ ```
50
+
51
+ Both commands print, per repo, the absolute directory you work in:
52
+
53
+ ```
54
+ repo-a: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
55
+ repo-b: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-b
56
+ ```
57
+
58
+ Edit there — not in your original clones. Stage and commit across the lane's repos:
59
+
60
+ ```bash
61
+ gr2 add . --repo-path ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
62
+ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
63
+ ```
64
+
65
+ `commit` with the lane flags commits every lane repo that has staged changes and names the repos it skipped. If every repo was skipped it exits non-zero with one sentence naming where it looked — and, when it can see them, where your staged changes actually are. Run one command across every lane repo, then turn the lane into one reviewable object:
66
+
67
+ ```bash
68
+ gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
69
+ gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
70
+ gr2 lane current ~/ws default # where am I?
71
+ gr2 lane exit ~/ws default --actor human:you
72
+ ```
73
+
74
+ `exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
75
+
76
+ ## What works today, and what is not there yet
77
+
78
+ Alpha 2 is a working local workspace layer. Verified by running the walk above:
79
+
80
+ - `workspace` (init, materialize, status, migrate-gr1 from a gr1 gripspace), `lane` (create, enter, exit, current, lease), `store` (init, snapshot, log, diff, checkout), `exec run`, `repo status`, `sync status`, `review create-project`.
81
+ - Lanes are independent clones: two lanes, or two agents, never share refs, an index, or a working tree.
82
+ - A lane commit that commits nothing anywhere refuses loudly instead of reporting success.
83
+
84
+ Not there yet:
85
+
86
+ - The full walk with **remote** PRs (`gr2 push`, `gr2 pr create`) is documented in `--help` but was not exercised in a clean environment for this README; treat those two as alpha.
87
+ - `gr2 --help` and some verb output still say "prototype" in places; the wording is being cleaned up as verbs land.
88
+ - The Rust `gr` (gr1) still owns `spawn`, `fleet`, and `manifest` until their gr2 ports land. Everything else — workspace sync, lanes, the multi-repo slice, its review — is gr2's job; if a verb is missing or wrong there, that is a bug worth reporting, not a reason to reach for gr1.
89
+
90
+ ## Commands
91
+
92
+ | Group | Verbs |
93
+ |---|---|
94
+ | `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1 |
95
+ | `spec` | show, validate |
96
+ | `lane` | create, enter, exit, current, resolve, bind, lease |
97
+ | (top level) | branch, add, commit, push, prune |
98
+ | `sync` | status, run |
99
+ | `pr` | create, status, checks, merge |
100
+ | `review` | open, close, checkout-pr, run, requirements, bind, verify, rebind, create-project |
101
+ | `exec` | status, run |
102
+ | `repo` | status, hooks, hook-run, projection-run |
103
+ | `store` | init, snapshot, log, diff, checkout |
104
+ | `target`, `config`, `plan`, `apply` | stored PR target; config overlays; show/apply the materialization plan |
105
+
106
+ ## Overlay substrate
107
+
108
+ 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).
109
+
110
+ ## Development
111
+
112
+ ```bash
113
+ pip install -e "gr2[dev]" # from the repository root
114
+ cd gr2 && pytest # the gr2 suite (tests + overlay tests)
115
+ cd gr2 && ruff check . # lint, same config as CI
116
+ ```
@@ -0,0 +1,101 @@
1
+ # gr2
2
+
3
+ **gr2 is the workspace layer for multi-repo work.** One repository is just git; when a change spans repositories — a feature slice, a release, several agents touching several repos — gr2 gives you a workspace over them, isolated lanes to work in, and one grouped review/PR set for the slice. It is the Python successor to the Rust `gr` (1.x, called gr1 below); both ship from this repository, and `gr2` is the command for the workspace and the slice.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ python3 -m venv ~/gr2-venv && source ~/gr2-venv/bin/activate
9
+ pip install --pre gitgrip # the PyPI package is "gitgrip"; the command is "gr2"
10
+ gr2 --version
11
+ ```
12
+
13
+ `--pre` is required while 2.x is an alpha — without it pip installs 1.5.1, which is gr1. To run unreleased development code instead, install from a checkout: `pip install -e gr2/` from the repository root.
14
+
15
+ The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`. The two do not collide; you can have both installed.
16
+
17
+ ## First five minutes
18
+
19
+ Every command below was run, in this order, in a clean virtualenv against a throwaway workspace of two repositories. Put two clones side by side in one folder, say `~/ws/repo-a` and `~/ws/repo-b`.
20
+
21
+ ```bash
22
+ cd ~/ws
23
+ gr2 workspace init ~/ws # scans the folder; writes .grip/workspace_spec.toml
24
+ gr2 workspace materialize ~/ws --yes # builds the .grip layout and a default unit
25
+ gr2 workspace status ~/ws # what kind of workspace this is
26
+ gr2 store init ~/ws # the workspace snapshot store (needed before review)
27
+ ```
28
+
29
+ A **unit** is one worker — you, or one agent — and `default` is created for you. A **lane** is one piece of work spanning repos, with its own clones, so two lanes never step on each other:
30
+
31
+ ```bash
32
+ gr2 lane create ~/ws default feat-x --repos repo-a,repo-b --branch feat/x
33
+ gr2 lane enter ~/ws default feat-x --actor human:you
34
+ ```
35
+
36
+ Both commands print, per repo, the absolute directory you work in:
37
+
38
+ ```
39
+ repo-a: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
40
+ repo-b: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-b
41
+ ```
42
+
43
+ Edit there — not in your original clones. Stage and commit across the lane's repos:
44
+
45
+ ```bash
46
+ gr2 add . --repo-path ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
47
+ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
48
+ ```
49
+
50
+ `commit` with the lane flags commits every lane repo that has staged changes and names the repos it skipped. If every repo was skipped it exits non-zero with one sentence naming where it looked — and, when it can see them, where your staged changes actually are. Run one command across every lane repo, then turn the lane into one reviewable object:
51
+
52
+ ```bash
53
+ gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
54
+ gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
55
+ gr2 lane current ~/ws default # where am I?
56
+ gr2 lane exit ~/ws default --actor human:you
57
+ ```
58
+
59
+ `exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
60
+
61
+ ## What works today, and what is not there yet
62
+
63
+ Alpha 2 is a working local workspace layer. Verified by running the walk above:
64
+
65
+ - `workspace` (init, materialize, status, migrate-gr1 from a gr1 gripspace), `lane` (create, enter, exit, current, lease), `store` (init, snapshot, log, diff, checkout), `exec run`, `repo status`, `sync status`, `review create-project`.
66
+ - Lanes are independent clones: two lanes, or two agents, never share refs, an index, or a working tree.
67
+ - A lane commit that commits nothing anywhere refuses loudly instead of reporting success.
68
+
69
+ Not there yet:
70
+
71
+ - The full walk with **remote** PRs (`gr2 push`, `gr2 pr create`) is documented in `--help` but was not exercised in a clean environment for this README; treat those two as alpha.
72
+ - `gr2 --help` and some verb output still say "prototype" in places; the wording is being cleaned up as verbs land.
73
+ - The Rust `gr` (gr1) still owns `spawn`, `fleet`, and `manifest` until their gr2 ports land. Everything else — workspace sync, lanes, the multi-repo slice, its review — is gr2's job; if a verb is missing or wrong there, that is a bug worth reporting, not a reason to reach for gr1.
74
+
75
+ ## Commands
76
+
77
+ | Group | Verbs |
78
+ |---|---|
79
+ | `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1 |
80
+ | `spec` | show, validate |
81
+ | `lane` | create, enter, exit, current, resolve, bind, lease |
82
+ | (top level) | branch, add, commit, push, prune |
83
+ | `sync` | status, run |
84
+ | `pr` | create, status, checks, merge |
85
+ | `review` | open, close, checkout-pr, run, requirements, bind, verify, rebind, create-project |
86
+ | `exec` | status, run |
87
+ | `repo` | status, hooks, hook-run, projection-run |
88
+ | `store` | init, snapshot, log, diff, checkout |
89
+ | `target`, `config`, `plan`, `apply` | stored PR target; config overlays; show/apply the materialization plan |
90
+
91
+ ## Overlay substrate
92
+
93
+ 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).
94
+
95
+ ## Development
96
+
97
+ ```bash
98
+ pip install -e "gr2[dev]" # from the repository root
99
+ cd gr2 && pytest # the gr2 suite (tests + overlay tests)
100
+ cd gr2 && ruff check . # lint, same config as CI
101
+ ```
@@ -0,0 +1,116 @@
1
+ Metadata-Version: 2.4
2
+ Name: gitgrip
3
+ Version: 2.0.0a2
4
+ Summary: Workspace layer for multi-repo work: workspaces, isolated lanes, and one grouped review per slice
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: typer>=0.9
8
+ Requires-Dist: tomli_w>=1.0
9
+ Requires-Dist: pyyaml>=6.0
10
+ Requires-Dist: toml>=0.10
11
+ Requires-Dist: jsonschema>=4.18
12
+ Provides-Extra: dev
13
+ Requires-Dist: pytest>=8.0; extra == "dev"
14
+ Requires-Dist: ruff>=0.4; extra == "dev"
15
+
16
+ # gr2
17
+
18
+ **gr2 is the workspace layer for multi-repo work.** One repository is just git; when a change spans repositories — a feature slice, a release, several agents touching several repos — gr2 gives you a workspace over them, isolated lanes to work in, and one grouped review/PR set for the slice. It is the Python successor to the Rust `gr` (1.x, called gr1 below); both ship from this repository, and `gr2` is the command for the workspace and the slice.
19
+
20
+ ## Install
21
+
22
+ ```bash
23
+ python3 -m venv ~/gr2-venv && source ~/gr2-venv/bin/activate
24
+ pip install --pre gitgrip # the PyPI package is "gitgrip"; the command is "gr2"
25
+ gr2 --version
26
+ ```
27
+
28
+ `--pre` is required while 2.x is an alpha — without it pip installs 1.5.1, which is gr1. To run unreleased development code instead, install from a checkout: `pip install -e gr2/` from the repository root.
29
+
30
+ The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`. The two do not collide; you can have both installed.
31
+
32
+ ## First five minutes
33
+
34
+ Every command below was run, in this order, in a clean virtualenv against a throwaway workspace of two repositories. Put two clones side by side in one folder, say `~/ws/repo-a` and `~/ws/repo-b`.
35
+
36
+ ```bash
37
+ cd ~/ws
38
+ gr2 workspace init ~/ws # scans the folder; writes .grip/workspace_spec.toml
39
+ gr2 workspace materialize ~/ws --yes # builds the .grip layout and a default unit
40
+ gr2 workspace status ~/ws # what kind of workspace this is
41
+ gr2 store init ~/ws # the workspace snapshot store (needed before review)
42
+ ```
43
+
44
+ A **unit** is one worker — you, or one agent — and `default` is created for you. A **lane** is one piece of work spanning repos, with its own clones, so two lanes never step on each other:
45
+
46
+ ```bash
47
+ gr2 lane create ~/ws default feat-x --repos repo-a,repo-b --branch feat/x
48
+ gr2 lane enter ~/ws default feat-x --actor human:you
49
+ ```
50
+
51
+ Both commands print, per repo, the absolute directory you work in:
52
+
53
+ ```
54
+ repo-a: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
55
+ repo-b: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-b
56
+ ```
57
+
58
+ Edit there — not in your original clones. Stage and commit across the lane's repos:
59
+
60
+ ```bash
61
+ gr2 add . --repo-path ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
62
+ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
63
+ ```
64
+
65
+ `commit` with the lane flags commits every lane repo that has staged changes and names the repos it skipped. If every repo was skipped it exits non-zero with one sentence naming where it looked — and, when it can see them, where your staged changes actually are. Run one command across every lane repo, then turn the lane into one reviewable object:
66
+
67
+ ```bash
68
+ gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
69
+ gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
70
+ gr2 lane current ~/ws default # where am I?
71
+ gr2 lane exit ~/ws default --actor human:you
72
+ ```
73
+
74
+ `exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
75
+
76
+ ## What works today, and what is not there yet
77
+
78
+ Alpha 2 is a working local workspace layer. Verified by running the walk above:
79
+
80
+ - `workspace` (init, materialize, status, migrate-gr1 from a gr1 gripspace), `lane` (create, enter, exit, current, lease), `store` (init, snapshot, log, diff, checkout), `exec run`, `repo status`, `sync status`, `review create-project`.
81
+ - Lanes are independent clones: two lanes, or two agents, never share refs, an index, or a working tree.
82
+ - A lane commit that commits nothing anywhere refuses loudly instead of reporting success.
83
+
84
+ Not there yet:
85
+
86
+ - The full walk with **remote** PRs (`gr2 push`, `gr2 pr create`) is documented in `--help` but was not exercised in a clean environment for this README; treat those two as alpha.
87
+ - `gr2 --help` and some verb output still say "prototype" in places; the wording is being cleaned up as verbs land.
88
+ - The Rust `gr` (gr1) still owns `spawn`, `fleet`, and `manifest` until their gr2 ports land. Everything else — workspace sync, lanes, the multi-repo slice, its review — is gr2's job; if a verb is missing or wrong there, that is a bug worth reporting, not a reason to reach for gr1.
89
+
90
+ ## Commands
91
+
92
+ | Group | Verbs |
93
+ |---|---|
94
+ | `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1 |
95
+ | `spec` | show, validate |
96
+ | `lane` | create, enter, exit, current, resolve, bind, lease |
97
+ | (top level) | branch, add, commit, push, prune |
98
+ | `sync` | status, run |
99
+ | `pr` | create, status, checks, merge |
100
+ | `review` | open, close, checkout-pr, run, requirements, bind, verify, rebind, create-project |
101
+ | `exec` | status, run |
102
+ | `repo` | status, hooks, hook-run, projection-run |
103
+ | `store` | init, snapshot, log, diff, checkout |
104
+ | `target`, `config`, `plan`, `apply` | stored PR target; config overlays; show/apply the materialization plan |
105
+
106
+ ## Overlay substrate
107
+
108
+ 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).
109
+
110
+ ## Development
111
+
112
+ ```bash
113
+ pip install -e "gr2[dev]" # from the repository root
114
+ cd gr2 && pytest # the gr2 suite (tests + overlay tests)
115
+ cd gr2 && ruff check . # lint, same config as CI
116
+ ```
@@ -1,11 +1,5 @@
1
- MANIFEST.in
2
1
  README.md
3
- VERSION
4
2
  pyproject.toml
5
- _build/backend.py
6
- _build/version_from_cargo.py
7
- _build/__pycache__/backend.cpython-311.pyc
8
- _build/__pycache__/version_from_cargo.cpython-311.pyc
9
3
  gitgrip.egg-info/PKG-INFO
10
4
  gitgrip.egg-info/SOURCES.txt
11
5
  gitgrip.egg-info/dependency_links.txt
@@ -66,6 +60,7 @@ python_cli/events.py
66
60
  python_cli/execops.py
67
61
  python_cli/failures.py
68
62
  python_cli/file_exec.py
63
+ python_cli/git_review.py
69
64
  python_cli/gitops.py
70
65
  python_cli/grip.py
71
66
  python_cli/grip_cli.py
@@ -80,8 +75,11 @@ python_cli/project_review.py
80
75
  python_cli/prune.py
81
76
  python_cli/push.py
82
77
  python_cli/review.py
78
+ python_cli/review_dispatch.py
83
79
  python_cli/review_ephemeral.py
80
+ python_cli/review_rebind.py
84
81
  python_cli/review_run.py
82
+ python_cli/review_runners.py
85
83
  python_cli/spec_apply.py
86
84
  python_cli/staging_cleanup.py
87
85
  python_cli/syncops.py
@@ -97,6 +95,7 @@ tests/test_clone_materialization.py
97
95
  tests/test_commit.py
98
96
  tests/test_config_base_path_guard.py
99
97
  tests/test_config_overlay.py
98
+ tests/test_conftest_git_isolation.py
100
99
  tests/test_contribution_protocol.py
101
100
  tests/test_ensure_lane_checkout_reference_clone.py
102
101
  tests/test_env_materialization.py
@@ -104,8 +103,12 @@ tests/test_event_log_integrity.py
104
103
  tests/test_event_outcome_policy.py
105
104
  tests/test_events.py
106
105
  tests/test_events_torn_line.py
106
+ tests/test_exec_apostrophe_and_oserror.py
107
+ tests/test_exec_single_string_and_materialize_plan.py
107
108
  tests/test_execops.py
108
109
  tests/test_failure_event_outcome.py
110
+ tests/test_foreground_launch_runtime.py
111
+ tests/test_git_review.py
109
112
  tests/test_gr2_packaging.py
110
113
  tests/test_gr2_review_receipt.py
111
114
  tests/test_grip_cli.py
@@ -118,6 +121,7 @@ tests/test_jsonl_store.py
118
121
  tests/test_lane_create_fork_base_cli.py
119
122
  tests/test_lane_lease_show_json.py
120
123
  tests/test_lane_lifecycle_safety.py
124
+ tests/test_lane_repo_paths_and_all_skipped.py
121
125
  tests/test_lane_toml_serialization.py
122
126
  tests/test_launch_primitive.py
123
127
  tests/test_m2_overlay_hindsight.py
@@ -158,11 +162,13 @@ tests/test_pr_merge_partial_failure.py
158
162
  tests/test_project_file_materialization.py
159
163
  tests/test_project_review_range_reconstruction.py
160
164
  tests/test_project_review_three_repo.py
165
+ tests/test_projection_tracked_dest.py
161
166
  tests/test_propagation_contribution.py
162
167
  tests/test_propagation_daemon.py
163
168
  tests/test_propagation_state_machine.py
164
169
  tests/test_prune.py
165
170
  tests/test_push.py
171
+ tests/test_readme_verbs_exist.py
166
172
  tests/test_repo_status_linked_worktree.py
167
173
  tests/test_repo_status_schema_version.py
168
174
  tests/test_repo_status_symlinked_git_dir.py
@@ -172,19 +178,28 @@ tests/test_review_bind_verify.py
172
178
  tests/test_review_cli.py
173
179
  tests/test_review_close_gr.py
174
180
  tests/test_review_create_project_cli.py
181
+ tests/test_review_dispatch.py
175
182
  tests/test_review_ephemeral.py
176
183
  tests/test_review_open_lane.py
184
+ tests/test_review_rebind.py
177
185
  tests/test_review_run.py
178
186
  tests/test_review_run_import_isolation.py
179
187
  tests/test_review_run_rerun_and_refusal_receipt.py
188
+ tests/test_review_runners.py
180
189
  tests/test_review_verify_inside.py
181
190
  tests/test_rmtree_or_refuse.py
191
+ tests/test_single_repo_cwd_refusal.py
182
192
  tests/test_snapshot_id_prefix_resolution.py
183
193
  tests/test_spec_apply_event_outcomes.py
184
194
  tests/test_sprint21_sync_platform.py
185
195
  tests/test_staging_cleanup.py
196
+ tests/test_store_verb_rename.py
186
197
  tests/test_sync_event_outcomes.py
198
+ tests/test_sync_fast_forward.py
187
199
  tests/test_sync_fetch.py
200
+ tests/test_sync_seed_local.py
201
+ tests/test_sync_ssh_rewrite.py
202
+ tests/test_sync_status_probe.py
188
203
  tests/test_target.py
189
204
  tests/test_tmux_launch_runtime.py
190
205
  tests/test_unit_abort.py
@@ -193,9 +208,10 @@ tests/test_unit_apply_dry_run.py
193
208
  tests/test_unit_manifest_schema.py
194
209
  tests/test_unit_propose.py
195
210
  tests/test_unit_topological_apply.py
196
- tests/test_version_single_sourced.py
211
+ tests/test_version_static.py
197
212
  tests/test_workspace_convert_clone.py
198
213
  tests/test_workspace_edit_lease_cap.py
199
214
  tests/test_workspace_identity_boundary.py
200
215
  tests/test_workspace_init_from_topology.py
216
+ tests/test_workspace_init_local_repos.py
201
217
  tests/test_workspace_snapshot.py
@@ -1,2 +1,3 @@
1
1
  [console_scripts]
2
+ git-review = gr2.python_cli.git_review:main
2
3
  gr2 = gr2.python_cli.app:main
@@ -0,0 +1,9 @@
1
+ """gr2 overlay substrate: config-overlay capture, composition, and materialization.
2
+
3
+ M1 scope: Tier A only (config files), eager materialization, trust-gated.
4
+
5
+ The distribution version is single-sourced from the package metadata (the static
6
+ number in gr2/pyproject.toml); this module carries no ``__version__`` literal so a
7
+ stale third number cannot drift here. Read it with
8
+ ``importlib.metadata.version("gitgrip")`` or ``gr2 --version``.
9
+ """
@@ -8,6 +8,7 @@ import json
8
8
  import multiprocessing
9
9
  import os
10
10
  import subprocess
11
+ import sys
11
12
  import tempfile
12
13
  from pathlib import Path
13
14
 
@@ -65,7 +66,7 @@ repos = ["app"]
65
66
  def create_lane(root: Path, workspace_root: Path) -> None:
66
67
  run(
67
68
  [
68
- "python3",
69
+ sys.executable,
69
70
  str(lane_proto(root)),
70
71
  "create-lane",
71
72
  str(workspace_root),
@@ -88,7 +89,7 @@ def worker(workspace_root: str, actor: str, queue, disable_locking: bool) -> Non
88
89
  env["GR2_LEASE_TEST_DELAY"] = "0.02"
89
90
  proc = run(
90
91
  [
91
- "python3",
92
+ sys.executable,
92
93
  str(lane_proto(root)),
93
94
  "acquire-lane-lease",
94
95
  workspace_root,
@@ -154,7 +155,7 @@ def release_all(root: Path, workspace_root: Path, disable_locking: bool) -> None
154
155
  for actor in ("worker:a", "worker:b"):
155
156
  run(
156
157
  [
157
- "python3",
158
+ sys.executable,
158
159
  str(lane_proto(root)),
159
160
  "release-lane-lease",
160
161
  str(workspace_root),
@@ -8,6 +8,7 @@ import json
8
8
  import multiprocessing
9
9
  import os
10
10
  import subprocess
11
+ import sys
11
12
  import tempfile
12
13
  from pathlib import Path
13
14
 
@@ -65,7 +66,7 @@ repos = ["app"]
65
66
  for unit, lane in (("atlas", "lane-a"), ("apollo", "lane-b")):
66
67
  result = _run(
67
68
  [
68
- "python3",
69
+ sys.executable,
69
70
  str(lane_proto(root)),
70
71
  "create-lane",
71
72
  str(workspace_root),
@@ -100,7 +101,7 @@ def _acquire_worker(
100
101
  env["GR2_LEASE_TEST_DELAY"] = "0.04"
101
102
  result = _run(
102
103
  [
103
- "python3",
104
+ sys.executable,
104
105
  str(lane_proto(repo_root())),
105
106
  "acquire-lane-lease",
106
107
  workspace_root,
@@ -190,7 +191,7 @@ def sequential_control() -> dict[str, object]:
190
191
  outcomes.append(
191
192
  _run(
192
193
  [
193
- "python3",
194
+ sys.executable,
194
195
  str(lane_proto(repo_root())),
195
196
  "acquire-lane-lease",
196
197
  str(workspace_root),